Можно ли взаимодействовать с таблицей соединений, с действием создания формы? - PullRequest
1 голос
/ 14 февраля 2010

* Обратите внимание, чтобы просмотреть весь код, перейдите по ссылке

Я создаю новые "учетные записи". Каждая новая учетная запись имеет: много пользователей. У пользователей есть_and_belong_to_many роли . Я пытаюсь назначить СУЩЕСТВУЮЩИЕ роли новым пользователям в форме новой учетной записи. Как правило, простой процесс, однако ...

Ассоциация между пользователями и ролями have_and_belong_to_many предполагает, что пользователи и роли связаны таблицей соединений. У меня нет модели для работы. Так что я не уверен, как это сделать. Я могу создавать новые роли, используя методы, обозначенные здесь (в ответе), но я не знаю, как назначить существующие роли новым пользователям через модель учетной записи.

Эквивалент SQl будет выглядеть примерно так: SQL (0.1ms) INSERT INTO "roles_users" ("role_id", "user_id") VALUES (6, 29) Где мне нужно 29, чтобы функционировать как идентификатор нового пользователя, созданного в рельсах, т.е. VAULES (6, ID)

Текущий код: (создает новую роль)

<% f.fields_for :users do |builder| %>
<%= render 'user_fields', :f => builder %>
<p>Login  : <%= f.text_field :login %>
<p>Email  : <%= f.text_field :email %>
<p>Password  : <%= f.password_field :password %>
<p>Confirm Password  : <%= f.password_field :password_confirmation %>
<%= f.hidden_field :account_id, :value => :id %>


<% f.fields_for :roles do |builder| %>
     <%= builder.hidden_field :name, :value => 'test' %>
<% end %>

Account.rb

has_many :users
accepts_nested_attributes_for :users

User.rb

has_and_belongs_to_many :roles
accepts_nested_attributes_for :roles

accounts_controller.rb

def new
    @account = Account.new
    #builds user and roles in memory
    1.times do
      user =  @account.users.build 
    1.times { user.roles.build }
  end

1 Ответ

1 голос
/ 14 февраля 2010

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

Вот что нужно сделать:

  1. удалить accepts_nested_attributes_for :roles из user.rb (необязательно, но рекомендуется)
  2. Назначить поле role_ids в форме создания пользователя.

Эта точка зрения должна проиллюстрировать точку:

<% f.fields_for :users do |builder| %>
<p>Login  : <%= f.text_field :login %>
<p>Email  : <%= f.text_field :email %>
<p>Password  : <%= f.password_field :password %>
<p>Confirm Password  : <%= f.password_field :password_confirmation %>
<%= f.hidden_field :account_id, :value => :id %>

<%= f.collection_select :role_ids, Role.all, :id, :name, {}, :multiple => true %>

<% end %>

Не изменяя ничего другого, Rails будет заполнять модель соединения при создании вместо изменения существующих ролей или создания новых.

...