我有以下内容效果很好:
@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
答案 0 :(得分:2)
错误消息告诉您错误:current_user
对象不存在@requestable
,无论是什么。
current_user
很可能是从ApplicationController
继承的函数,或者至少通常存在于其中的函数。它通常根据当前会话返回User对象。但这不是Rails的内置部分,因此如果您希望我进一步了解,我们需要更多信息。
@requestable
看起来像一个多态模型实例,因此它不会知道当前会话。
这里发生了一些Rails魔术,我觉得这让你感到困惑。
@requestable.request_threads
和current_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