0

我有以下效果很好:

@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
4

1 回答 1

2

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

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

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


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

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

我认为,通过您迄今为止向我们展示的代码,您正试图与您正在创建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
于 2010-11-12T01:12:16.020 回答