Я знаю, что говорят документы
params = ActionController::Parameters.new(user: { name: "Francesco", age: 22 })
permitted = params.require(:user).permit(:name, :age)
#=> { name: "Francesco", age: 22 }
User.update!(permitted)
Проблема в том, что это ломается в некоторых крайних случаях
params = ActionController::Parameters.new(user: "Francesco")
permitted = params.require(:user).permit(:name, :age)
#=> NoMethodError: undefined method `permit' for "Francesco":String
Я придумал альтернативу, которая не 't break
params = ActionController::Parameters.new(user: { name: "Francesco", age: 22 })
permitted = params.permit(user: [:name, :age]).require(:user)
#=> { name: "Francesco", age: 22 }
params = ActionController::Parameters.new(user: "Francesco")
permitted = params.permit(user: [:name, :age]).require(:user)
#=> ActionController::ParameterMissing: param is missing or the value is empty: user
Это почти именно тот результат, который я ожидал, однако, если есть другие параметры, которые меня не волнуют, я получаю недопустимую ошибку параметров (предупреждение), которая не возникает, если я сначала используйте require
.
params = ActionController::Parameters.new(authentication_token: '123', user: { name: "Francesco", age: 22 }, group_id: 456)
permitted = params.permit(user: [:name, :age]).require(:user)
# Unpermitted parameters: :authentication_token, :group_id
#=> { name: "Francesco", age: 22 }
permitted = params.require(:user).permit(:name, :age)
#=> { name: "Francesco", age: 22 }
Есть ли способ разрешить параметры, которые
- не будут давать ошибку (предупреждение) о недопустимых параметрах для параметров на уровне root
- все равно выдаст это предупреждение, если у пользователя есть какие-либо дополнительные параметры ha sh
- вызовет
ActionController::ParameterMissing
или любую другую легко распознаваемую ошибку, если :user
отсутствует - не вызовет общую ошибку c, если
:user
является скаляром. Вернет что-то пустое или вернет ActionController::ParameterMissing
или другую легко распознаваемую ошибку (не NoMethodError
)