繁体   English   中英

Rails 3 has_many通过复选框形式不起作用(不起作用)

[英]Rails 3 has_many through checkbox form doesn't (does not) work

我已经坚持了一天。 我已经听说过所有有关Rails能够处理这样的简单复杂性的谈话(尽管这不是(或应该不是很复杂))。

故事:用户可以拥有许多高级学位。 我希望能够使用has_many通过关系创建此关联,并在我的视图中使用复选框。

楷模:

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关系。

我在这里做错了什么?

不知道您是否已经解决了这个问题,但是我发现了一件事情:班级用户难道不应该拥有“ has_many:advanced_degrees”和“ has_many:degrees”吗? 可能想尝试在没有源代码的情况下尝试(除非您正在尝试某种多态的东西),这就是我做类似事情的方式。

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

您需要确保attr_accessible具有您在复选框中设置的attr。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM