【问题标题】:Rails 3 has_many through checkbox form doesn't (does not) workRails 3 has_many 通过复选框形式不(不)工作
【发布时间】:2011-08-02 12:39:20
【问题描述】:

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

故事:用户可以拥有许多高级学位。我希望能够使用 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

活动记录:

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

我在这里做错了什么?

【问题讨论】:

  • 你是怎么解决的?

标签: ruby-on-rails forms checkbox has-many-through has-many


【解决方案1】:

您需要确保 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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      不确定你是否已经解决了这个问题,但我发现了一件事:用户类不应该有 'has_many :advanced_degrees' 和 'has_many :degrees' 吗?可能想在没有源的情况下尝试它(除非你正在尝试多态的东西),这就是我做类似事情的方式。

      【讨论】:

        猜你喜欢
        • 2013-08-16
        • 1970-01-01
        • 2011-06-30
        • 2012-06-17
        • 2016-07-23
        • 2016-02-18
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        相关资源
        最近更新 更多