Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过嵌套表单获取用户ID以在自定义属性编写器中使用_Ruby On Rails_Checkbox_Nested Forms - Fatal编程技术网

Ruby on rails 通过嵌套表单获取用户ID以在自定义属性编写器中使用

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 %> <%=

我试图只获取在嵌套表单中检查的用户的ID。我使用这些ID更新ListsUsers联接表中的属性。现在,我所拥有的将获取属于列表的所有用户的值,而不管他们的复选框是否被选中。我需要忽略未选中的框

这是我的嵌套表单:

<%= 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