Rails 500错误 - 强参数

时间:2017-02-21 06:59:18

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

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

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

6 个答案:

答案 0 :(得分:3)

那是因为您正在接收

格式的参数
{"company_id"=>"6", "id"=>"10"}

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

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

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

答案 1 :(得分:0)

您需要更改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

注意:如果您要使用"user[company_id]"

,输入字段的名称必须类似于params.require(:user).permit(:company_id)

答案 2 :(得分:0)

下面的代码表示您的表单参数(一旦反序列化)必须封装在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 :(得分:0)

根据这里的评论,我能够让它发挥作用。它当然看起来不像红宝石。是否有更好或更简单的方法来重写它?

  <Button
      android:layout_height="wrap_content"
      android:layout_width="wrap_content"
      android:text="Login"
      local:MvxBind="Click LoginCommand" />

答案 4 :(得分:0)

正如其他人所说,您需要将参数包装在顶级键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]一样简单。

答案 5 :(得分:-1)

问题在于你的形式。您没有约束company_id模型中的user。 你的参数应该像{'user' => {'company_id' => 6, 'id' => 10}}一样......等等...... 因此,绑定用户和&amp;然后重新发送你的ajax。