Каков наиболее подходящий способ разрешить вложенные параметры в рельсы - PullRequest
0 голосов
/ 05 августа 2020

Я знаю, что говорят документы

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 }

Есть ли способ разрешить параметры, которые

  1. не будут давать ошибку (предупреждение) о недопустимых параметрах для параметров на уровне root
  2. все равно выдаст это предупреждение, если у пользователя есть какие-либо дополнительные параметры ha sh
  3. вызовет ActionController::ParameterMissing или любую другую легко распознаваемую ошибку, если :user отсутствует
  4. не вызовет общую ошибку c, если :user является скаляром. Вернет что-то пустое или вернет ActionController::ParameterMissing или другую легко распознаваемую ошибку (не NoMethodError)
...