2011-04-10 58 views
2

我一直在這一天卡住了一天。我聽說過Rails能夠處理這樣簡單的複雜性的所有這些話題(儘管這不是/不應該是複雜的)。Rails 3 has_many通過複選框形式不(不)工作

故事:用戶可以有很多高級學位。我希望能夠通過has_many through關係創建該關聯,並在我的視圖中使用複選框。

型號:

class User < ActiveRecord::Base 
    has_many :user_degree_lists 
    has_many :degrees, :through => :user_degree_lists, :source => :advanced_degree, :dependent => :destroy 
end 

class AdvancedDegree < ActiveRecord::Base 
    attr_accessible :value, :description 
    has_many :user_degree_lists 
end 

class UserDegreeList < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :advanced_degree 
end 

的ActiveRecord:

class CreateUserDegreeLists < ActiveRecord::Migration 
    def self.up 
    create_table :user_degree_lists do |t| 
     t.integer :user_id 
     t.integer :advanced_degree_id 

     t.timestamps 
    end 
    add_index :user_degree_lists, :user_id 
    add_index :user_degree_lists, :advanced_degree_id 
    add_index :user_degree_lists, [:user_id, :advanced_degree_id], :unique => true  
    end 

    def self.down 
    drop_table :user_degree_lists 
    end 
end 

查看:

<%= form_for(@user, :html => {:autocomplete => 'off', :id => "sign_up_user" }) do |f| %> 
... 
    <% for advanced_degree in AdvancedDegree.find(:all)%>  
    <%= check_box_tag "user[advanced_degree_ids][]", advanced_degree.id, @user.degrees.include?  (advanced_degree.id) %>      
    <%= f.label :advanced_degrees, advanced_degree.description %> 
... 
<% end %> 

一旦提交表單,所有用戶字段被更新,但:user_degree_lists關係不創建。

我在這裏做錯了什麼?

+0

你是如何解決它的? – sparkle 2013-07-03 18:52:38

回答

0

不知道你是否已經解決了這個問題,但是我發現了一件事情:不應該讓用戶有'has_many:advanced_degrees'和'has_many:degrees'?可能想嘗試一下,如果沒有它的源代碼(除非你正在嘗試多態的東西),那就是我做了類似的事情。

0

1)我將「UserDegreeList」重命名爲「UserDegree」,因爲這是一個連接表。

2)「AdvancedDegree.find(:all)」可以是「AdvancedDegree.all」。

3)我同意與先前的評論,它應該被重新命名爲「的has_many:advanced_degrees」

4)爲了解決這個問題,你可以添加以下到用戶:

accepts_nested_attributes_for :advanced_degrees, :allow_destroy => true, :reject_if => :all_blank 
0

您需要請確保attr_accessible具有您在複選框中設置的屬性。

class Zone < ActiveRecord::Base 

    attr_accessible :name, :active, :user_ids 

    has_many :user_zones 
    has_many :users, :through => :user_zones 

end 

class User < ActiveRecord::Base 

    attr_accessible :name, :zone_ids 

    has_many :user_zones 
    has_many :zones, :through => :user_zones 

end