0

當試圖更新模型時,我遇到了嚴重的參數錯誤。創建操作有效,更新失敗。Rails 500錯誤 - 強參數

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' 

控制器PARAMS

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

我正在使用link_to來修補此記錄。 不知道如何構建以下內容以包含:user用戶參數。 <%= link_to company_user_path(:company_id => current_user.company_id,:id => user),:method =>:patch,remote:true do%><%= render partial:「permission」,locals:{角色:user.role.to_s.upcase}%><% end %> – martinmsf

回答

3

那是因爲你是在

{"company_id"=>"6", "id"=>"10"} 
格式接收PARAMS

但是a ccording您user_params方法,你需要它的格式:

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

使params.require(:user)將篩選出的user PARAMS。 我想,問題是與形式。

+0

根據這裏的評論,我能夠使其工作。它當然看起來不像ruby-esque。如果有更好或更簡單的方法來寫這個? <%= link_to company_user_path(「user [company_id]」=> current_user.company_id,id:user),方法:: patch,remote:true do%> <%= render partial:「permission」,locals: {role:user.role.to_s.upcase}%> <% end %>' – martinmsf

-1

問題出在你的表格上。您沒有約束user模型中的company_id。 您的參數應該像{'user' => {'company_id' => 6, 'id' => 10}}等等...... 因此,綁定用戶&中的值,然後重新發送您的ajax。

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)

+0

謝謝,那肯定會縮小它的範圍。如何以上述格式在link_to標籤中構造參數? '<(%)=的link_to company_user_path(:COMPANY_ID => current_user.company_id,:ID =>用戶),:方法=>:貼劑,遠程:真正做%> <%=渲染部分: 「許可」,當地人:{role:user.role.to_s.upcase}%> <% end %>' – martinmsf

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]

0

根據這裏的評論,我能夠使它工作。它當然看起來不像ruby-esque。有沒有更好或更簡單的方法來重寫?

<%= 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 %> 
+0

'<%= link_to company_user_path({'user'=> {company_id:current_user.company_id,id:user}}),method :: patch ,遠程:true do%>' – Sravan

0

如前所述別人,你需要有下的頂級鍵user包裹的參數。最簡單的方法是使用ActionController::ParamsWrapper,而不必更改HTML。只需激活它在你的UsersController這樣的:

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

你可能的格式列表縮小到你實際使用的手機。另外,假設您有User型號,也可以省略型號名稱。因此這條線可以變得像wrap_parameters format: [:url_encoded_form]一樣簡單。