2011-04-10 31 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