2010-07-13 33 views
2

首先,我覺得我正在接近這個錯誤的方式,但我不知道如何去做。這也有點難以解釋,所以請耐心等待。Rails:在保存更新之前操作參數 - 錯誤的方法?

我使用Javascript來允許用戶在編輯表單中添加多個文本區域,但這些文本區域是針對單獨模型的。它基本上允許用戶以兩種模式而不是一種模式編輯信息。這裏是關係:

class Incident < ActiveRecord::Base 
    has_many :incident_notes 
    belongs_to :user 
end 

class IncidentNote < ActiveRecord::Base 
    belongs_to :incident 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :incidents 
    has_many :incident_notes 
end 

當用戶添加一個「事件註釋」,它應該自動識別該特定用戶的筆記。我還希望多個用戶能夠爲同一事件添加備註。

我遇到的問題是,當用戶添加新的文本區域時,rails無法知道新的incident_note屬於用戶。所以它最終創建了incident_note,但user_id是零。例如,在日誌中我看到了下面的INSERT語句,當我編輯的形式,並添加新的註釋:

INSERT INTO "incident_notes" ("created_at", "updated_at", "user_id", "note", "incident_id") VALUES('2010-07-02 14:09:11', '2010-07-02 14:09:11', NULL, 'Another note', 8)

所以我已經決定嘗試做的是操縱PARAMS爲:事件更新方法。這樣我就可以自己添加user_id,但是這看起來不像滑軌,但我不確定它是如何的。

當提交表單時,這些參數是這樣的:

Parameters: {"commit"=>"Update", "action"=>"update", "_method"=>"put", "authenticity_token"=>"at/FBNxjq16Vrk8/iIscWn2IIdY1jtivzEQzSOn0I4k=", "id"=>"18", "customer_id"=>"4", "controller"=>"incidents", "incident"=>{"title"=>"agggh", "incident_status_id"=>"1", "incident_notes_attributes"=>{"1279033253229"=>{"_destroy"=>"", "note"=>"test"}, "0"=>{"id"=>"31", "_destroy"=>"", "note"=>"asdf"}}, "user_id"=>"2", "capc_id"=>"SDF01-071310-004"}}

所以我想我可以編輯本節:

"incident_notes_attributes"=>{"1279033253229"=>{"_destroy"=>"", "note"=>"test"}, "0"=>{"id"=>"31", "_destroy"=>"", "note"=>"another test"}}

正如你所看到的,一個他們還沒有一個id,這意味着它將被新插入表中。

我想另一個屬性添加到新的項目,所以它看起來是這樣的:

"incident_notes_attributes"=>{"1279033253229"=>{"_destroy"=>"", "note"=>"test", "user_id" => "2"}, "0"=>{"id"=>"31", "_destroy"=>"", "note"=>"another test"}}

,但這又似乎未鐵軌樣,我不知道怎麼去解決它。以下是事件控制器的更新方法。

# PUT /incidents/1 
# PUT /incidents/1.xml 
def update 
    @incident = @customer.incidents.find(params[:id]) 

    respond_to do |format| 
    if @incident.update_attributes(params[:incident]) 
    # etc, etc 
end 

我想我也許可以添加類似以下內容:

params[:incident].incident_note_attributes.each do |inote_atts| 
    for att in inote_atts 
    if att.id == nil 
     att.user_id = current_user.id 
    end 
    end 
end 

但顯然incident_note_attributes不是方法。所以我不知道該怎麼做。我怎麼解決這個問題?

對不起,對文本的牆。任何幫助深表感謝!

回答

2

我有一個類似的規定,這是我怎麼解決它:

class Incident < ActiveRecord::Base 
    has_many :incident_notes 
    belongs_to :user 

    attr_accessor :new_incident_note 

    before_save :append_incident_note 

    protected 

    def append_incident_note 
    self.incident_notes.build(:note => self.new_incident_note) if !self.new_incident_note.blank? 
    end 
end 

,然後在表格中,您只需使用標準軌form_for並使用new_incident_note作爲屬性。

我選擇了這種方法,因爲我知道它只是將數據扔到筆記中進行小數據驗證。如果您有深入的驗證,那麼我推薦使用accepts_nested_attributes_forfields_for。這是非常有據可查的here

相關問題