При обновлении с Rails 3.2 до Rails 5 я столкнулся с этой проблемой, когда модель внезапно отказывается сохранять.Rails 5 Назначение массива _ids не работает has_many: через ассоциацию
У меня есть 2 модели: ClosingDay
и Location
которые имеют has_many: через отношение через модель ClosingDayLocation
. При создании ClosingDay
пользователю необходимо выбрать 1 или более Location
записей с использованием флажков.
Однако, независимо от Location
записи я выбрать на форме, я всегда получаю сохранение ошибки в ClosingDay
записи рассказывал мне, что ассоциированное ClosingDayLocation
является недействительным, поскольку closing_day_id
пуст.
Модели:
class ClosingDay < ActiveRecord::Base
has_many :closing_day_locations, :dependent => :destroy
has_many :locations, :through => :closing_day_locations
end
class Location < ActiveRecord::Base
has_many :closing_day_locations, :dependent => :destroy
has_many :closing_days, :through => :closing_day_locations
end
class ClosingDayLocation < ActiveRecord::Base
belongs_to :location
belongs_to :closing_day
validates :closing_day_id, :presence => true
validates :location_id, :presence => true
end
Контроллер
def create
@closing_day = ClosingDay.build(closing_day_params)
if @closing_day.save
redirect_to(closing_days_url, :notice => 'OK')
else
@locations = Location.active.order(:name)
render :action => 'new'
end
end
private
def closing_day_params
params.require(:closing_day).permit(:date, :name, location_ids: [])
end
Форма
<%= form_for(@closing_day) do |f| %>
<%= show_errors_for(@closing_day) %>
<table>
<tr>
<td><%= f.label :name %></td>
<td><%= f.text_field :name %></td>
</tr>
<tr>
<td><%= f.label :date %></td>
<td><%= f.text_field :date %></td>
</tr>
<tr>
<td><%= label_tag 'closing_day[location_ids][]', 'Locations' %></td>
<td>
<%= hidden_field_tag 'closing_day[location_ids][]', nil %>
<% @locations.each do |location| %>
<p>
<%= label_tag do %>
<%= check_box_tag 'closing_day[location_ids][]', location.id, @closing_day.location_ids.include?(location.id) %>
<%= location.name %>
<% end %>
</p>
<% end %>
</td>
</tr>
<tr>
<td colspan="2"><%= f.submit %></td>
</tr>
</table>
<% end %>
Короче говоря, я хочу, чтобы создать new @closing_day
записывать и назначать ассоциированные (ранее существовавшие) местоположения, назначая Location
идентификаторы, используя @closing_day.location_ids = [3,6,9]
. Это работает в Rails 3.2, но, похоже, не работает в Rails 5.
Каков наилучший способ сохранить эту функциональность? Я также попытался добавить accepts_nested_attributes_for :locations, :allow_destroy => true
и accepts_nested_attributes_for :closing_day_locations, :allow_destroy => true
, но это не работает. Кажется, что созданы связанные модели ClosingDayLocation
, но closing_day_id
остается пустым, что приводит к ошибке.
Кроме того, вы сказали, что используете has-and-their-to-many, но из своего кода, я думаю, что вы используете has_many: через –
Исправить. Я обновлю! Благодарю. – ChrisDekker