2010-11-12 74 views
0

我有伟大的工程如下:Rails中,模型关系问题

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

而且我有这个伟大的工程:

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

但是,如果我尝试用2号线:

@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

也许这样的事情... @ requestable.find_by_user(CURRENT_USER).request_threads.new(PARAMS [:request_thread]) – mpapis 2010-11-12 01:18:05

回答

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 
+0

感谢亚当。你是对的,可请求是一个带引用的多态模型。 – AnApprentice 2010-11-12 01:18:55

+0

刚刚添加了find_requestable。有其他信息会有帮助吗? thxs – AnApprentice 2010-11-12 01:20:44

+0

re current_user,更正它是一个用户对象,由devise支持。 – AnApprentice 2010-11-12 01:22:14