accepts_nested_attributes_for и collection_select, как построить представление? - PullRequest
2 голосов
/ 31 января 2010

У меня есть модель Journey, в которой много пользователей (водителей). Я хочу иметь возможность с помощью accepts_nested_attributes_for добавлять и удалять водителей из путешествия. Когда я добавляю водителя, я хочу показать пользователю

# Models
class Journey < ActiveRecord::Base
  has_many :drivers
  accepts_nested_attributes_for :drivers, :allow_destroy => true
  has_many :users, :through => :drivers
  accepts_nested_attributes_for :users
end

class Driver < ActiveRecord::Base
  belongs_to :journey
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :drivers
  has_many :journeys, :through => :drivers
end

# View _form.html.erb
<% form_for(@journey) do |f| %>
  <%= f.error_messages %>
  <% f.fields_for :drivers do |d| %>
    <%= render :partial => 'driver', :locals => { :f => d } %>
  <% end %>
  <p><%= f.submit 'Submit' %></p>
<% end %>

# View _driver.html.erb
<p><%= f.collection_select(:id, User.all, :id, :name)%></p>

Ошибка говорит:

ActiveRecord::AssociationTypeMismatch in JourneysController#create
Driver(#2185315860) expected, got Array(#2151950220)

Я подозреваю, что мой _driver.html.erb неправильный, но я не знаю, как это исправить. Не могли бы вы помочь мне с некоторыми подсказками здесь

1 Ответ

3 голосов
/ 31 января 2010

Ваш _driver.html.erb должен выглядеть так:

<%= f.collection_select(:user_id, User.all, :id, :name) %>

Но я не уверен, вызывает ли это ошибку.

Также, когда я использую accepts_nested_attributes_for для вложенных моделей, я делаю это так:

# Models
class Journey < ActiveRecord::Base
  has_many :drivers
  accepts_nested_attributes_for :drivers, :allow_destroy => true
  has_many :users, :through => :drivers
end

class Driver < ActiveRecord::Base
  belongs_to :journey
  belongs_to :user
  accepts_nested_attributes_for :users
end

Так что вы можете иметь такие формы:

<% form_for @journey do |f| %>
   <% fields_for :drivers do |d| %>
      <% fields_for :user do |u| %>
        <%= u.text_field :name %>
        ...
      <% end %>
    <% end %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...