Подтвердить что ты не робот

Rails 3 params нежелательная упаковка

Я размещаю JSON как JSON-форму {:name => "hello"} для моего контроллера Rails 3 ExampleController.

Вместо того, чтобы получать params как:

{:name => "hello"}

Я получаю:

{:name => "hello", :controller => "example", :action => "index", :example => {:name => "hello"}

(Да, данные JSON появляются дважды! и добавляются действие и контроллер)

Любая идея, почему?

4b9b3361

Ответ 1

ActionController автоматически делает это для запросов JSON, чтобы вы могли легко передавать параметры в Example.create или @example.update_attributes, что означает, что клиенту не нужно их упаковывать для своей модели - он может включать только name et. и др. на верхнем уровне ваших данных JSON, и контроллер будет обрабатывать группировку.

@example = Example.create params[:example]

Код обертывания параметров получает имя вашей модели от имени контроллера, но вы можете изменить его, используя макрос wrap_parameters в вашем контроллере:

wrap_parameters :thing

Или выключите его с помощью

wrap_parameters false

В Rails 3.2, если ваша модель использует attr_accessible, функция обтекания параметров также исключает любые параметры, недоступные для массового присвоения. Вы также можете использовать макрос, чтобы сделать эту функцию обертки применимой к другим типам контента, кроме JSON, если хотите.

По умолчанию во вновь создаваемом приложении Rails это настроено для всех контроллеров с использованием инициализатора. Найдите config/initializers/wrap_parameters.rb.