Разделение нескольких моделей в представлении формы Rails - PullRequest
0 голосов
/ 16 декабря 2011

В частности, у меня есть форма для создания User. Одним из полей является Group, которое представляет собой отдельную модель. Во время действия User#create я вызываю Group.find_or_create_by_name, чтобы проверить, существует ли уже Group, извлекая params[:user][:group], и создать Group, если его не существует.

Но когда я создаю User, я не могу передать params[:user], потому что params[:user][:group] - это не группа, это String. Это было бы намного проще, если бы я мог предоставить params[:user] и params[:group] своему контроллеру вместо всего, что связано в одну переменную, но я не знаю, как это сделать.

Соответствующий код:

Пользователь # создать

@group = Group.find_or_create_by_name(params[:user][:group])
@group.save!
@user = @group.users.build(params[:user])

Частичная схема пользователя

create_table "users", :force => true do |t|
  t.string   "name",                :default => "",    :null => false
  t.string   "email",                                  :null => false
  t.integer  "group_id"

Частичная групповая схема

create_table "groups", :force => true do |t|
  t.string   "name"
  t.text     "description"
  t.datetime "created_at"
  t.datetime "updated_at"

Параметр Дамп из отправки формы

{"commit"=>"Register",
 "authenticity_token"=>"x1KgPdpJop5H2NldsPtk0+mBDtrmpM/oNABOxjpabIU=",
  "utf8"=>"✓",
  "user"=>{"name"=>"aName",
  "group"=>"aGroupName",
  "password_confirmation"=>"[FILTERED]",
  "password"=>"[FILTERED]",
  "email"=>"anEmail"}}

Лучшее объяснение, с которым я столкнулся, это этот вопрос.

Я действительно не хочу начинать перестановку params внутри моего контроллера, так как это действительно вызывает у меня тошноту и кажется ужасным программированием. Что действительно заставляет меня задаться вопросом, есть ли у меня большая проблема.

Если это противоречит соглашениям Rails, каков лучший способ сделать это, и почему я не должен это делать?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2011

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

Если вы используете форму, которая создает несколько экземпляров модели одновременно (желательно связанных), вам сначала нужно использовать помощник accepts_nested_attributes_for вопределение вашей модели (вероятно, прямо под вашими заявленными ассоциациями).Причина этого в том, что он создает метод установки, который знает, как написать этот тип связанной модели.(Примечание: вы также можете определить этот метод самостоятельно в своей основной модели).Как только вы это сделаете, вы можете вложить fields_for в form_for, и Rails будет знать, как выполнять правильные назначения.

Сначала я думал, что accepts_nested_attributes_for относится к вложенным ресурсам,что, безусловно, не так.Если вам нужна дополнительная информация, обратитесь к разделу 11.8.3 (стр. 343-347) Rails 3 Way.

0 голосов
/ 16 декабря 2011

Я не думаю, что правильный способ сделать это здесь - это создать пользователя из группы.Это было бы уместно, если бы вы были в действии GroupsController, которое, например, добавляло новых пользователей в группу.Я думаю, что лучшим подходом здесь было бы сделать следующее:

@group = Group.find_or_create_by_name(params[:user][:group])
@group.save!
@user = User.new(params[:user])
@user.group_id = @group.id
@user.save

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

Имеет ли это смысл?

...