Rails,模型关系问题

时间:2010-11-12 00:40:29

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

我有以下内容效果很好:

@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

1 个答案:

答案 0 :(得分:2)

错误消息告诉您错误:current_user对象不存在@requestable,无论是什么。

current_user很可能是从ApplicationController继承的函数,或者至少通常存在于其中的函数。它通常根据当前会话返回User对象。但这不是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