взгляните на это. Очень странно, поскольку ActionController::Parameters
является подклассом Hash, вы можете преобразовать его непосредственно в хеш, используя метод to_h
для хэша params.
Однако to_h
будет работать только с параметрами из белого списка, поэтому вы можете сделать что-то вроде:
permitted = params.require(:line_item).permit(: line_item_attributes_attributes)
attributes = permitted.to_h || {}
attributes.values
Но если вместо этого вы не хотите вносить в белый список, вам просто нужно использовать метод to_unsafe_h
.
Обновлять
Мне было очень интересно узнать об этой проблеме, поэтому я начал исследовать, и теперь, когда вы выяснили, что используете Rails 5, ну, это и есть причина этой проблемы, как сказал @tillmo в стабильных выпусках Rails, таких как 4.x, ActionController::Parameters
— это подкласс Hash, поэтому он действительно должен реагировать на метод values
, однако в Rails 5 ActionController::Parameters
теперь возвращает Object вместо Hash
Примечание: это не влияет на доступ к ключам в хэше параметров, например params[:id]
. Вы можете просмотреть Pull Request, в котором реализовано это изменение.
Для доступа к параметрам в объекте вы можете добавить to_h
к параметрам:
params.to_h
Если мы посмотрим на метод to_h
в ActionController::Parameters
, мы увидим, что он проверяет, разрешены ли параметры, прежде чем преобразовывать их в хэш.
# actionpack/lib/action_controller/metal/strong_parameters.rb
def to_h
if permitted?
@parameters.to_h
else
slice(*self.class.always_permitted_parameters).permit!.to_h
end
end
Например:
def do_something_with_params
params.slice(:param_1, :param_2)
end
Что вернет:
{ :param_1 => "a", :param_2 => "2" }
Но теперь это вернет объект ActionController::Parameters
.
Вызов to_h
для этого вернет пустой хеш, потому что param_1 и param_2 не разрешены.
Чтобы получить доступ к параметрам из ActionController::Parameters
, вам нужно сначала разрешить параметры, а затем вызвать to_h
для объекта.
def do_something_with_params
params.permit([:param_1, :param_2]).to_h
end
Вышеприведенное вернет хеш с только что разрешенными параметрами, но если вы не хотите разрешать параметры и хотите пропустить этот шаг, есть другой способ, используя метод to_unsafe_hash
:
def do_something_with_params
params.to_unsafe_h.slice(:param_1, :param_2)
end
Существует способ всегда разрешать параметры из конфигурации из application.rb, если вы хотите всегда разрешать определенные параметры, вы можете установить параметр конфигурации. Примечание: это вернет хэш со строковыми ключами, а не символьными ключами.
#controller and action are parameters that are always permitter by default, but you need to add it in this config.
config.always_permitted_parameters = %w( controller action param_1 param_2)
Теперь вы можете получить доступ к таким параметрам, как:
def do_something_with_params
params.slice("param_1", "param_2").to_h
end
Обратите внимание, что теперь ключи являются строками, а не символами.
Надеюсь, это поможет вам понять корень вашей проблемы.
Источник: eileen.codes
person
svelandiag
schedule
22.01.2016
ActionController::Parameters
должен отвечать наvalues
. Какие у вас версии ruby и rails? Не могли бы вы добавитьlogger.warn attributes.inspect
? - person tillmo   schedule 22.01.2016