【问题标题】:Rails, Model Relationship QuestionRails,模型关系问题
【发布时间】:2010-11-12 00:40:28
【问题描述】:

我有以下效果很好:

@request_thread = current_user.request_threads.new(params[:request_thread])

我有这个效果很好:

@requestable = find_requestable
@request_thread = @requestable.request_threads.new(params[:request_thread])

但如果我尝试第二行:

@request_thread = @requestable.current_user.request_threads.new(params[:request_thread])

使用 current_user 我得到以下错误:

NoMethodError (undefined method `current_user' for #<Photo:0x10f95c828>):
app/controllers/request_threads_controller.rb:52:in `create'
app/middleware/flash_session_cookie_middleware.rb:14:in `call'

我在这里搞砸了什么?

谢谢

更新 - 使用 find_requestable

  # http://asciicasts.com/episodes/154-polymorphic-association
  def find_requestable  
    params.each do |name, value|  
      if name =~ /(.+)_id$/  
        return $1.classify.constantize.find(value)  
      end  
    end  
    nil  
  end

【问题讨论】:

  • 可能是这样的... @requestable.find_by_user(current_user).request_threads.new(params[:request_thread])

标签: ruby-on-rails activerecord ruby-on-rails-3 activemodel


【解决方案1】:

错误消息告诉您到底出了什么问题:current_user 不存在 @requestable 对象,不管是什么。

current_user 很可能是从ApplicationController 继承的函数,或者至少它通常是它所在的位置。它通常根据当前会话返回一个用户对象。但这不是 Rails 的内置部分,因此如果您希望我更详细地介绍,我们需要更多信息。

@requestable 看起来像一个多态模型实例,因此它不会知道当前会话。


这里发生了一些 Rails 魔法,我认为这让你感到困惑。

@requestable.request_threadscurrent_user.request_threads 都是 Rails 在这些对象上生成的辅助函数,通过过滤结果和自动填充值来节省您的时间。

我认为,根据您目前向我们展示的代码,您正在尝试将 current_user 与您正在创建的新 request_thread 关联。在这种情况下,您可以简单地将其手动合并到属性中。由于我不知道您的模型是什么样的,我只能猜测字段名称:

@request_thread = @requestable.request_threads.new( params[:request_thread].merge(:user => current_user) )

就像我说的,可链接的函数只是为了方便。例如,你可以这样写:

@request_thread = request_thread.new(params[:request_thread])
@request_thread.requestable = find_requestable
@request_thread.user = current_user

【讨论】:

  • 谢谢亚当。没错,requestable 是一个带引用的多态模型。
  • 刚刚添加了什么 find_requestable。还有其他有用的信息吗?谢谢
  • re current_user,更正它是一个用户对象,由设计提供支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多