我正在尝试批量更新用户,并因此将用户信息数组传递给user_params。我知道(/相信)这是问题,但我不明白如何解决它,它一直给我错误'在UserController中的ArgumentError#update_all - 错误的参数数量(1为0)'
我相信我要问的问题是,我如何选择将数组传递给user_params进行批量更新,但也可以向其发送单个用户的信息。感谢任何信息,以了解我在哪里错过了正在发生的事情。
谢谢!
users_controller.rb
def update_all
params["user"].keys.each do |id|
@user = User.find(id.to_i)
@user.update_attributes(user_params(id))
end
redirect_to(users_path)
end
def user_params
params.require(:user).permit:first_name, :last_name, :email, :password, :password_confirmation, :role_id, :approved)
end
表格
<h1>Editing users</h1>
<%= form_for :user, :url => update_all_path, :html => { :method => :put } do %>
<table>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>E-Mail</th>
</tr>
<% @users.each do |user| %>
<%= fields_for "user[]", user do |user_fields| %>
<tr>
<td><%= user_fields.text_field :first_name %></td>
<td><%= user_fields.text_field :last_name %></td>
<td><%= user_fields.email_field :email %></td>
<td><%= user_fields.check_box :approved %></td>
</tr>
<% end %>
<% end %>
</table>
<div class="actions">
<%= submit_tag %>
</div>
<% end %>
<%= link_to 'Back', users_path %>
答案 0 :(得分:1)
您尝试使用参数调用user_params
,但该方法(def user_params
)不会参数。
由于您已将表单设置为发送多个用户,因此params[:user]
如下所示:
{
"1"=>{"first_name"=>"K", "last_name"=>"P", "email"=>"k@", "approved"=>"1"},
"2"=>{"first_name"=>"A", "last_name"=>"Q", "email"=>"a@", "approved"=>"0"}
}
所以最简单的事情是在整个哈希而不是each
上运行.keys
:
params["user"].each do |id, attributes|
User.find(id).update_attributes(attributes)
end
但是,这避免了您的强参数要求,但是您需要在那里做更多的工作来处理整个哈希。在需要:user
后,您需要在该哈希值中的每个值上添加permit
个字段:
def bulk_user_params
users = params.require(:user).permit!
users.each do |id, attributes|
users[id] = attributes.permit(:first_name, :last_name, :email, :approved)
end
end
permit!
允许您params[:user]
中的所有密钥,因为这些密钥为1
,2
等。然后循环permit
并分配将属性哈希值过滤到您期望的值。
构建新的安全哈希后,在update_all
而不是基本user_params
中使用它:
bulk_user_params.each do |id, attributes|
User.find(id).update_attributes(attributes)
end
答案 1 :(得分:0)
@user.update_attributes(user_params(id))
应该是
@user.update_attributes(user_params)