传递一组user_params以在rails中更新

时间:2016-02-28 19:10:28

标签: ruby-on-rails

我正在尝试批量更新用户,并因此将用户信息数组传递给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 %>

2 个答案:

答案 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]中的所有密钥,因为这些密钥为12等。然后循环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)