2012-05-02 25 views
0

可以說我有,看起來像下面捕捉current_user.id節約深度嵌套的記錄

=form_for @survey do |f| 
    =f.text_field :name 
    =f.fields_for :questions do |question_fields| 
    =question_fields.text_field :question_text 
     =question_fields.fields_for :answers do |answer_fields| 
     =answer_fields.text_field :answer_text 

因爲形式的不同部分可以添加和我需要一種方式來獲得不同的用戶更新工作形式在保存之前將user_id分配到每個模型中。我意識到它不符合mvc能夠訪問模型內​​部的current_user,據說我沒有解決方案。

如果我只保存一個對象,那麼將current_user.id分配給控制器中的對象就足夠簡單了,但考慮到此表單的深度嵌套特性開始看起來像一個醜陋的解決方案。

是否有專家/專業的方式來處理?

的Rails 3.2,設計

回答

1

不能每個對象簡單地竊取他們的「父母」關係user_id?這是一個常見的模式:

class Answer < ActiveRecord::Base 
    before_validation :assign_user_id 

protected 
    def assign_user_id 
    # Don't attempt if the question is not defined, 
    # or the user_id field is already populated. 
    return unless (self.question or self.user) 

    self.user_id = self.question.user_id 
    end 
end 

這涉及到一個位附加數據庫活動來解決每個問題的答案,如在範圍創造它是不夠的,但它使得它幾乎萬無一失的。

您可能想要做的是創建每條記錄時參數user_id中的內容。這意味着您的create呼叫需要根據需要合併到:user_id密鑰中。但是,嵌套幫助程序不會默認執行此操作,因此,如果您使用該幫助程序,則可以將其保留爲assign方法。