Ruby on rails 通过嵌套表单获取用户ID以在自定义属性编写器中使用
我试图只获取在嵌套表单中检查的用户的ID。我使用这些ID更新ListsUsers联接表中的属性。现在,我所拥有的将获取属于列表的所有用户的值,而不管他们的复选框是否被选中。我需要忽略未选中的框 这是我的嵌套表单:Ruby on rails 通过嵌套表单获取用户ID以在自定义属性编写器中使用,ruby-on-rails,checkbox,nested-forms,Ruby On Rails,Checkbox,Nested Forms,我试图只获取在嵌套表单中检查的用户的ID。我使用这些ID更新ListsUsers联接表中的属性。现在,我所拥有的将获取属于列表的所有用户的值,而不管他们的复选框是否被选中。我需要忽略未选中的框 这是我的嵌套表单: <%= form_for(@list) do |f| %> <%= f.fields_for :users do |users_fields| %> <%= users_fields.object.name %> <%=
<%= form_for(@list) do |f| %>
<%= f.fields_for :users do |users_fields| %>
<%= users_fields.object.name %>
<%= users_fields.check_box :id %>
<% end %>
<%= f.submit %>
<% end %>
这是我的表单复选框的HTML输出
First User
<input name="list[users_attributes][0][id]" type="hidden" value="0">
<input type="checkbox" value="1" checked="checked" name="list[users_attributes][0][id]" id="list_users_attributes_0_id">
<input type="hidden" value="1" name="list[users_attributes][0][id]" id="list_users_attributes_0_id">
Second User
<input name="list[users_attributes][1][id]" type="hidden" value="0">
<input type="checkbox" value="1" name="list[users_attributes][1][id]" id="list_users_attributes_1_id">
我希望只有第一个值{“id”=“1}
这是前两个用户选中,最后一个用户未选中的输出:
{"0"=>{"id"=>"1"}, "1"=>{"id"=>"2"}, "2"=>{"id"=>"3"}}
以下是我点击pry之前表单提交时的控制台输出:
Started PATCH "/lists/1" for 127.0.0.1 at 2017-12-21 00:08:43 -0800
Processing by ListsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"XXXXXX==", "list"=>
{"users_attributes"=>{"0"=>{"id"=>"1"}, "1"=>{"id"=>"2"}, "2"=>{"id"=>"3"}}}, "commit"=>"Update List", "id"=>"1"}
List Load (0.3ms) SELECT "lists".* FROM "lists" WHERE "lists"."id" = ?
LIMIT ? [["id", 1], ["LIMIT", 1]]
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]]
(0.1ms) begin transaction
我的解决方案:
我将ID作为隐藏字段传递
<%= form_for(@list) do |f| %>
<%= f.fields_for :users, @list.users do |user_field| %>
<%= user_field.hidden_field :id %>
<%= user_field.object.name %>
<%= user_field.check_box :enable %>
<% end %>
<%= f.submit %>
<% end %>
现在,我可以根据ID的:enable
值来决定保留哪些ID和放弃哪些ID
def users_attributes=(users_attributes)
admin_user_ids = []
users_attributes.values.each do |user_attribute|
if user_attribute.values[1] == "1"
user_ids << user_attribute.values[0].to_i
end
end
join_entries = ListsUser.jointables(self.id)
join_entries.each do |entry|
if user_ids.include?(entry.user_id)
entry.update(admin: true)
else
entry.update(admin: false)
end
end
end
def users\u attributes=(users\u attributes)
管理员用户ID=[]
users_attributes.values.each do| user_属性|
如果用户_属性值[1]=“1”
提交表单时,用户ID和控制台输出是什么?(请添加到问题。)很抱歉。更新了它。你能显示你的实际控制台日志而不是你的pry吗?也许你的列表参数不正确。好吧,朋友。很明显,你的表单中有一些关于的内容,特别是用户字段。请勾选框:id
。很遗憾,我来这里帮你已经太晚了。跳幸运的是,将会有一位才华横溢的人出现。谢谢你的帮助!非常感谢你的关注。祝你晚安!
Started PATCH "/lists/1" for 127.0.0.1 at 2017-12-21 00:08:43 -0800
Processing by ListsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"XXXXXX==", "list"=>
{"users_attributes"=>{"0"=>{"id"=>"1"}, "1"=>{"id"=>"2"}, "2"=>{"id"=>"3"}}}, "commit"=>"Update List", "id"=>"1"}
List Load (0.3ms) SELECT "lists".* FROM "lists" WHERE "lists"."id" = ?
LIMIT ? [["id", 1], ["LIMIT", 1]]
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]]
(0.1ms) begin transaction
<%= form_for(@list) do |f| %>
<%= f.fields_for :users, @list.users do |user_field| %>
<%= user_field.hidden_field :id %>
<%= user_field.object.name %>
<%= user_field.check_box :enable %>
<% end %>
<%= f.submit %>
<% end %>
class User < ApplicationRecord
has_many :lists_users
has_many :lists, through: :lists_users
attr_accessor :enable
end
def users_attributes=(users_attributes)
admin_user_ids = []
users_attributes.values.each do |user_attribute|
if user_attribute.values[1] == "1"
user_ids << user_attribute.values[0].to_i
end
end
join_entries = ListsUser.jointables(self.id)
join_entries.each do |entry|
if user_ids.include?(entry.user_id)
entry.update(admin: true)
else
entry.update(admin: false)
end
end
end