2010-11-12 104 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