ruby-on-rails - rails 4 表格 : has_many through: checkboxes

标签 ruby-on-rails has-many-through

原始问题

两个资源:用户动物。创建用户时,客户端会选择复选框来说明他们拥有多少动物。

当提交用户表单时,它不仅应该创建一个新的user记录,还应该在animal_users丰富的连接表中创建一堆记录来代表客户选择的每个复选框。

我认为问题是我没有为表单中的复选框部分正确指定某些内容。我看过checkbox_tag APIRails Guides on Forms ,以及许多网站和 stackOverflow 帖子。

提前致谢,代码如下:

原始代码(下面的答案代码):

型号:

#models/user.rb
class User < ActiveRecord::Base
  has_many :animals, through: :animal_users
  has_many :animal_users
  accepts_nested_attributes_for :animal_users, allow_destroy: true
end

#models/animal.rb
class Animal < ActiveRecord::Base
  has_many :users, through: :animal_users
  has_many :animal_users
end

#models/animal_user.rb
class AnimalUser < ActiveRecord::Base
  belongs_to :animal
  belongs_to :user
end

用户表单:

#views/users/_form.html.erb
    <%= form_for(@user) do |f| %>
  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>

  <div>
    <% Animal.all.each do |animal| %>
    <label>
        <%= check_box_tag "user[animal_ids][]", animal.id, f.object.animals.include?(animal) %>
        <%= animal.animal_name %>
    <% end %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

users_controller.rb中的强参数

def user_params
      params.require(:user).permit(:name, animal_users_attributes: [:_destroy, :id, :user_id, :animal_id])
end
<小时/>

此处回答代码:

型号:

#models/user.rb
class User < ActiveRecord::Base
  has_many :animals, through: :animal_users
  has_many :animal_users
end

#models/animal.rb
class Animal < ActiveRecord::Base
  has_many :users, through: :animal_users
  has_many :animal_users
end

#models/animal_user.rb
class AnimalUser < ActiveRecord::Base
  belongs_to :animal
  belongs_to :user
end

用户表单:

#views/users/_form.html.erb
<%= form_for(@user) do |f| %>
  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>

  # Checkbox part of the form that now works!
    <div>
      <% Animal.all.each do |animal| %>
        <%= check_box_tag "user[animal_ids][]", animal.id, f.object.animals.include?(animal) %>
        <%= animal.animal_name %>
      <% end %>
    </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

users_controller.rb中的强参数

  def user_params
    params.require(:user).permit(:name, animal_ids: [])
  end

为了完整起见,以下是表单提交时传递到服务器的内容:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"xyz=", "user"=>{"name"=>"Neil", "animal_ids"=>["1", "3"]}, "commit"=>"Create User"}
 Animal Load (0.2ms)  SELECT "animals".* FROM "animals"  WHERE "animals"."id" IN (1, 3)
  (0.1ms)  begin transaction
 SQL (0.2ms)  INSERT INTO "users" ("created_at", "name", "updated_at") VALUES (?, ?, ?)  [["created_at", "2015-03-26 15:29:00.478767"], ["name", "Neil"], ["updated_at", "2015-03-26 15:29:00.478767"]]
 SQL (0.1ms)  INSERT INTO "animal_users" ("animal_id", "created_at", "updated_at") VALUES (?, ?, ?)  [["animal_id", 1], ["created_at", "2015-03-26 15:29:00.479833"], ["updated_at", "2015-03-26 15:29:00.479833"]]
 SQL (0.0ms)  INSERT INTO "animal_users" ("animal_id", "created_at", "updated_at") VALUES (?, ?, ?)  [["animal_id", 3], ["created_at", "2015-03-26 15:29:00.480644"], ["updated_at", "2015-03-26 15:29:00.480644"]]
 SQL (0.1ms)  UPDATE "animal_users" SET "updated_at" = ?, "user_id" = ? WHERE "animal_users"."id" = 6  [["updated_at", "2015-03-26 15:29:00.481362"], ["user_id", 8]]
 SQL (0.1ms)  UPDATE "animal_users" SET "updated_at" = ?, "user_id" = ? WHERE "animal_users"."id" = 7  [["updated_at", "2015-03-26 15:29:00.482062"], ["user_id", 8]]
  (2.4ms)  commit transaction

最佳答案

collection_check_boxes是一个更好的选择:

<%= f.collection_check_boxes(:animal_ids, Animal.all, :id, :name) do |animal| %>
  <%= animal.label { animal.check_box } %>
<% end %>

关于ruby-on-rails - rails 4 表格 : has_many through: checkboxes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29280294/

相关文章:

ruby-on-rails - 成功提交 AJAX 表单后如何重定向 (Rails 3.2)

ruby-on-rails - 比较包含与 eager_load 的 .references 要求

ruby-on-rails - Rails 3 - 文件名太长错误

mysql - Ruby on Rails 使用 WHERE 子句丰富了许多 :many,

ruby-on-rails - 如何定义以两种不同方式相互关联的两个模型之间的 ActiveRecord 关系?

javascript - Rails 如何加载 model_name.js?

ruby-on-rails - 使用 oAuth2 gem 和 facebook 的 OpenSSL 问题

Laravel hasMany通过多态关系

ruby - 从 rails 3 升级到 rails 4 时 has_many 关联的顺序错误