Изменение хэша params в Rails - PullRequest
6 голосов
/ 20 марта 2012

Я создаю вложенную модель в Rails, но я хочу добавить поля к вложенным моделям в контроллере. Я не использую hidden_field_tag, так как он может быть подделан.

Вот мой хэш params:

 Parameters: {"dummy"=>{"users_attributes"=>{"0"=>{"email"=>"jjjj@gmail.com", "id"=>"", "_destroy"=>"false"}, "1"=>{"email"=>"qqq@gmail.com", "id"=>"", "_destroy"=>"false"}}}, "commit"=>"Create Dummy"}

Я хочу, чтобы в каждом user_attributes с именем companyid было поле. Допустим, я хотел, чтобы companyid был «компанией», тогда я подумал, что это сработает:

len = params["dummy"]["users_attributes"].size
 counter = 0
 while counter < len
  params["dummy"]["users_attributes"][counter]["companyid" => "company"]
  counter = counter + 1
end

Но я получаю ошибку "undefined method` [] 'для nil: NilClass "для первой строки в цикле while. Я не совсем уверен, почему.

Может ли кто-нибудь помочь мне, чтобы я мог изменить хэш параметров?

EDIT: Итак, я наконец понял это. Я действительно не использовал ни одно из решений точно. Сначала я установил тег hidden_field пустым для companyid. Затем в свой контроллер я положил:

 params["dummy"]["users_attributes"].each do |key, val|
  params["dummy"]["users_attributes"][key]["companyid"] = "company"
 end

Не самый элегантный код, но он будет работать.

Ответы [ 3 ]

4 голосов
/ 21 марта 2012

Хэш params является особенным, поскольку (особенно с формами) он отображается один на один с моделями, с которыми он связан, и Rails ожидает, что в модели будет либо столбец базы данных, либо метод имея это имя.

Скрытые поля являются типичным решением проблемы получения дополнительных данных, но если вы не хотите, чтобы пользователи видели эти поля, вы столкнетесь с проблемой отсутствия HTTP-данных. Так что в этом случае session[:something] ваш друг. Перед отображением формы или страницы, которые могут иметь скрытые данные, вместо этого добавьте данные в переменную сеанса (сначала зашифруйте ее), которую затем можно прочитать (и расшифровать), когда пользователь отправит форму. Или вы можете сохранить его в таблице базы данных и поместить в сеанс только идентификатор строки, чтобы данные могли быть прочитаны при публикации формы.

Если данные были частью модели, но вы просто не хотели отображать их, вы могли бы просто отобразить части, которые пользователь мог видеть на виде, но затем посмотреть остальные это в действии контроллера, когда пользователь отправил форму или запрос.

Если данные не являются чувствительными , вы можете просто объявить значения, которые пользователь может изменить как attr_accessible в своих соответствующих моделях (предотвращает массовое присвоение), и поместить остальные в скрытые поля.

0 голосов
/ 21 марта 2012

Хэш работает не так. Попробуйте это:

params["dummy"]["users_attributes"][counter]["companyid"] = "company"

РЕДАКТИРОВАТЬ В дополнение к ответу fl00r, да, вам необходимо установить ["companyid"] на {} первым.

0 голосов
/ 21 марта 2012

Это выглядит уродливо, и я не понимаю, что происходит, но ваша ошибка:

len = params["dummy"]["users_attributes"].size
counter = 0
while counter < len
  params["dummy"]["users_attributes"][counter] = { "companyid" => "company" }
  counter = counter + 1
end

Я считаю, что вы должны использовать accepts_nested_attributes_for здесь и инициализировать новые компании в контроллере, а не этот уродливыйкод

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/197-nested-model-form-part-2

...