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 => пользователь),: method =>: patch, remote: true do%><% = render partial: "permission", locals: { role: user.role.to_s.upcase}%><% end %> – martinmsf

ответ

3

Это потому, что вы получаете Params в формате

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

Но огласно вашего метода user_params, Вам это нужно в формате:

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

так, что params.require(:user) будет отфильтровывать user Params. Я думаю, проблема в форме.

+0

Основываясь на комментариях здесь, я смог заставить его работать. Это, конечно, не выглядит рубиновым. Если есть лучший или простой способ написать это? '<% = ссылка_to company_user_path (" user [company_id] "=> current_user.company_id, id: пользователь), метод:: patch, remote: true do%> <% = сделать частичное:" разрешение ", locals: {role: user.role.to_s.upcase}%> <% end %> ' – martinmsf

-1

Проблема в вашей форме. Вы не привязываете company_id к модели user. Ваш парам должен быть как {'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,: идентификатор => пользователь),: метод =>: патч, удаленный: верно делают%> <% = оказывают частичное: "разрешение", locals: {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

Основываясь на комментариях здесь, я смог заставить его работать. Это, конечно, не выглядит рубиновым. Есть ли лучший или простой способ переписать это?

<%= 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}}), метод:: patch , remote: true do%> ' – Sravan

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].