2016-08-17 2 views
1

При обновлении с 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 остается пустым, что приводит к ошибке.

ответ

0

После еще нескольких мастеринга я нашел проблему и решил ее. Я расскажу об этом здесь, если другие столкнутся с теми же проблемами!

class ClosingDayLocation < ActiveRecord::Base 
    belongs_to :location 
    belongs_to :closing_day 

    #validates :closing_day_id, :presence => true 
    #validates :location_id, :presence => true 
end 

После того, как эти 2 проверки были выполнены на промежуточной модели, она отлично работала как для создания, так и для обновления. По-видимому, некоторый порядок в проверке и сохранении связанных записей смещается между Rails 3.2 и Rails 5.

+1

Кроме того, вы сказали, что используете has-and-their-to-many, но из своего кода, я думаю, что вы используете has_many: через –

+0

Исправить. Я обновлю! Благодарю. – ChrisDekker

Смежные вопросы