【问题标题】:Rails 500 Error - Strong ParmetersRails 500 错误 - 字符串参数
【发布时间】:2017-02-21 06:59:18
【问题描述】:

在尝试更新模型时,我遇到了严重的参数错误。创建操作有效,更新失败。

Started PATCH "/companies/6/users/10" for 71....... at 2017-02-21 06:27:27 +0000
Processing by UsersController#update as JS

Parameters: {"company_id"=>"6", "id"=>"10"}

User Load (1.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 9], ["LIMIT", 1]]

SQL (3.6ms)  UPDATE "users" SET "last_activity_at" = '2017-02-21 06:27:27.940545' WHERE "users"."id" = $1  [["id", 9]]

User Load (0.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 10], ["LIMIT", 1]]

这个错误不是很有帮助,至少对我没有帮助:(

Completed 400 Bad Request in 12ms (ActiveRecord: 6.1ms)

ActionController::ParameterMissing (param is missing or the value is empty: user):

app/controllers/users_controller.rb:60:in `user_params'
app/controllers/users_controller.rb:43:in `block in update'
app/controllers/users_controller.rb:42:in `update'

控制器参数

def user_params
  params.require(:user).permit(:name, :role, :email, :company_id, :password, :password_confirmation, :current_password)
end

【问题讨论】:

  • 我正在使用 link_to 来修补此记录。不确定如何构建以下内容以使用 :user 参数包装所有内容。 current_user.company_id, :id => user), :method => :patch, remote: true do %>

标签: ruby-on-rails activerecord devise ruby-on-rails-5 strong-parameters


【解决方案1】:

那是因为您收到的参数格式为

{"company_id"=>"6", "id"=>"10"}

但根据您的user_params 方法,您需要的格式为:

{'user' => {"company_id"=>"6", "id"=>"10"}}

这样params.require(:user) 将过滤掉user 参数。 我猜,问题出在表格上。

【讨论】:

  • 基于这里的 cmets,我能够使其工作。它当然看起来不像红宝石。如果有更好或更简单的方法来写这个? <%= link_to company_user_path("user[company_id]" => current_user.company_id, id: user), method: :patch, remote: true do %> <%= render partial: "permission", locals: { role: user.role.to_s.upcase } %> <% end %>
【解决方案2】:

下面的代码意味着你的表单参数(一旦反序列化)必须封装在user参数中。

def user_params
  params.require(:user).permit(:name, :role, :email, :company_id, :password, :password_confirmation, :current_password)
end

具体来说,require(:user) 表示user 键必须存在于根级别,否则会抛出该错误。

permit(:name, :role, :email, :company_id, :password, :password_confirmation, :current_password)

返回包含参数中提供的键的散列。

所以提供数据{user: {company_id: '6', id: '10'}} 可以解决这个错误。

如果您使用表单来生成这些结果,则输入字段应以modelName[attributeName] 的形式命名,因此user[company_id]

【讨论】:

    【解决方案3】:

    您需要更改 HTML 以获取以下格式的参数。

    {"user" => { "company_id"=>"6", "id"=>"10" } }
    

    使用from helper 将为您做到这一点。

    <%= form_for @user do |f| %>
    

    或者您需要将 user_params 更改为

    def user_params
      params.permit(:name, :role, :email, :company_id, :password, :password_confirmation, :current_password)
    end
    

    注意:如果您想使用params.require(:user).permit(:company_id),输入字段的名称必须类似于"user[company_id]"

    【讨论】:

    • 谢谢,这肯定会缩小范围。如何在 link_to 标记中以您在上面概述的格式构造参数? &lt;%= link_to company_user_path(:company_id =&gt; current_user.company_id, :id =&gt; user), :method =&gt; :patch, remote: true do %&gt; &lt;%= render partial: "permission", locals: { role: user.role.to_s.upcase } %&gt; &lt;% end %&gt;
    【解决方案4】:

    基于此处的 cmets,我能够使其工作。它当然看起来不像红宝石。有没有更好或更简单的方法来重写它?

    <%= link_to company_user_path("user[company_id]" => current_user.company_id, id: user), method: :patch, remote: true do %>
       <%= render partial: "permission", locals: { role: user.role.to_s.upcase } %>
    <% end %>
    

    【讨论】:

    • &lt;%= link_to company_user_path({'user' =&gt; { company_id: current_user.company_id, id: user }}), method: :patch, remote: true do %&gt;
    【解决方案5】:

    正如其他人所说,您需要将参数包装在顶级键 user 下。实现这一点的最简单方法——无需更改 HTML——是使用ActionController::ParamsWrapper。只需在您的UsersController 中激活它,如下所示:

    class UsersController < ApplicationController
      wrap_parameters :user, format: [:json, :xml, :url_encoded_form, :multipart_form]
      …
    end
    

    您可以将格式列表缩小到您实际使用的格式。此外,假设您有一个User 模型,您也可以省略模型名称。因此,该行可以变得像wrap_parameters format: [:url_encoded_form] 一样简单。

    【讨论】:

      【解决方案6】:

      问题出在你的表单上。您没有在 user 模型中绑定 company_id。 你的参数应该是{'user' =&gt; {'company_id' =&gt; 6, 'id' =&gt; 10}}等等...... 因此,绑定用户中的值,然后重新发送您的 ajax。

      【讨论】:

        猜你喜欢
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 2021-09-20
        • 2020-05-18
        • 1970-01-01
        • 2021-12-20
        相关资源
        最近更新 更多