2011-11-26 61 views
1

我已經建立了一個has_many通過關係在我的分貝,並改變了關鍵,因爲我正在使用遺留數據庫。有許多通過複選框不保存值Rails3

這一切似乎工作,但我不能讓複選框保存到數據庫。

我的型號如下:

class Radcheck < ActiveRecord::Base 
    set_table_name 'radcheck' 
    attr_accessible :attribute_name, :username, :value, :op, :groupname 
    belongs_to :raduser 

    has_many :radusergroup, :dependent => :destroy, :primary_key => :username, :foreign_key => :groupname 
    has_many :radgroupcheck, :through => :radusergroup 
end 


class Radgroupcheck < ActiveRecord::Base 
    set_table_name 'radgroupcheck' 
    has_many :radusergroup, :dependent => :destroy#, :primary_key => :groupname, :foreign_key => :username 
    has_many :radcheck, :through => :radusergroup 
end 


class Radusergroup < ActiveRecord::Base 
    belongs_to :radcheck, :foreign_key => 'groupname', :primary_key => 'username' 
    belongs_to :radgroupcheck, :foreign_key => 'username', :primary_key => 'groupname' 
end 

在我的形式,我有這樣的:

<% Radgroupcheck.all.each do |group| -%> 
    <%= check_box_tag :groupnames, group.id, @radcheck.radgroupcheck.include?(group), :username => 'radcheck[groupname][]' -%> | <%= label_tag :groupnames, group.groupname -%> 
<% end -%> 

的形式呈現的複選框OK,我可以看到的組名,但沒有任何反應,當我打保存。

開發日誌很清晰,我在mysql查詢日誌中也看不到任何東西。在您的形式使用該

回答

4

嘗試:

<% Radgroupcheck.all.each do |group| -%> 
    <%= check_box_tag "radcheck[radgroupcheck_ids][]", radgroupcheck.id, @radcheck.radgroupchecks.include?(radgroupcheck), :id => "radcheck_radgroupcheck_id_#{radgroupcheck.id}" -%> 
    <%= label_tag "radcheck[radgroupcheck_ids][]", radgroupcheck.name, :for => "radcheck_radgroupcheck_id_#{radgroupcheck.id}" -%> 
<% end %> 

而在你的控制器:

def create 
    params[:radcheck][:radgroupcheck_ids] ||= [] 
    @radcheck = Radcheck.new(params[:radcheck]) 

    # rest of your controller logic 
end 

這是從我在Rails 3.1的項目什麼工作適合,基於http://railscasts.com/episodes/17-habtm-checkboxes?view=asciicast

+0

仍然沒有喜樂 - 和以前一樣:( –

+0

必須與我的命名有關嗎? –

+1

是的,命名必須是正確的。請嘗試在命令中使用'Radcheck.first.radgroupcheck_ids'安慰。這個方法應該返回一個ID數組。這個方法名稱是應該在HTML表單中使用的名稱。如果radgroupcheck_ids不是方法,請嘗試'將Radcheck.first.methods.grep(/ _ id /)'放在控制檯中並查找正確的方法。 –