尝试更新模型时,我遇到了强参数错误。创建操作有效,更新失败。
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
答案 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。