2014-03-27 89 views
1

我正在使用collection_check_boxes通過關係在has_many中創建對象; 這裏有些型號:select_check_boxes與一個有很多直通關係和:checked選項

#emotion.rb 
class Emotion < ActiveRecord::Base 
    has_many :emotional_states 
    has_many :reports, :through => :emotional_states 
end 

#report.rb 
class Report < ActiveRecord::Base 
    has_many :emotional_states 
    has_many :emotions, :through => :emotional_states 
    [... other "irrelevant" stuff here ...] 
end 

#emotional_states.rb 
class EmotionalState < ActiveRecord::Base 
    belongs_to :report 
    belongs_to :emotion 
end 

當我創建一個報告我也有collection_check_box選擇情緒我要綁定到該報告(通過模型EmotionalState)的列表正如你可以理解;一切工作在創建(我檢索散列值,如果@ report.save我也創建EmotionalStates與@ report.id和@ emotion.id。)

但是,當它來編輯報告我想編輯還有相關的EmotionalStates(這意味着創建新的EmotionalStates或刪除舊的EmotionalStates)。

如何使用所有可用的情緒填充select_check_boxes,檢查是否通過EmotionalStates項目關聯了情感?

如果我寫的是這樣的:

<%= collection_check_boxes(:report, :emotion_id, @report.emotional_states.map{|e| e.emotion}, :id, :name) %> 

我會爲每alredy相關情緒的未選中的複選框。

<%= collection_check_boxes(:report, :emotion_id, Emotion.all, :id, :name, :checked => @report.emotional_states.map{|e| e.emotion}) %> 

雖然這個代碼將正確返回Emotion.all,但不會檢查alredy有關通過@ report.emotional_states到@report情緒。

我找遍了所有周圍的wheb上的的用法示例:檢查collection_select_boxes選項沒有任何結果... 任何暗示?

回答

0

回來這個錯誤之後,我發現這個問題是一個不正確的使用.MAP的方法,映射整個對象(e.emotion)而不是它的id(e.emotion.id)。

這很容易固定我的問題:

<%= collection_check_boxes(:report, :emotion_id, Emotion.all, :id, :name, :checked => @report.emotional_states.map{|e| e.emotion.id}) %> 

謝謝您的幫助!

0

我在這個way.you做了同樣的一次也可以嘗試:

Emotions: 
     <% Emotion.all.each do |emotion| %> 

     <%= check_box_tag 'report[emotion_ids][]' , emotion.id, @report.emotion.include?(emotion) %><%= emotion.name %><br/> 
     <% end %> 

在控制器添加到:emotion_ids=>[]強參數。

一線到控制器更新方法: PARAMS [:報告] [:emotion_ids] || = []