2013-08-19 3 views
3

У меня сложная проблема в Rails 4, которую я попытаюсь описать ниже. Я использую простые формы и awesome_nested_fields драгоценные камни.Вложенные поля и сильные параметры

У меня есть куча событий с некоторыми полями в моем приложении

Вот мой рабочий event_controller Params до реализации accepts_nested_attributes:

private 

    def event_params 
    params.require(:event).permit(:title, :description, :type_id, :price, :program, 
            :start_date, :end_date, :image, category_ids: []) 
    end 

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

Event.rb

class Event < ActiveRecord::Base 
    has_many :speakers 
    accepts_nested_attributes_for :speakers, allow_destroy: true 
end 

Speaker.rb

class Speaker < ActiveRecord::Base 
    belongs_to :event 
end 

Добавление динамики (в моем случае добавления simple_form_for): контроллер

<%= f.nested_fields_for :speakers do |f| %> 
     <fieldset class="item"> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 

     <a href="#" class="remove">remove</a> 

     <%= f.hidden_field :id %> 
     <%= f.hidden_field :_destroy %> 
    </fieldset> 
    <% end %> 

Обновление для сильных параметров:

private 

    def event_params 
    params.require(:event).permit(:title, :description, :type_id, :price, :program, 
            :start_date, :end_date, :image, category_ids: [], 
            speakers_attributes: [ :name ]) 
    end 

Теперь, когда я запускаю мое приложение, при создании нового события я получаю:

can't write unknown attribute `event_id' 

Если удалить

speakers_attributes: [ :name ] 

от сильных параметров я буду иметь возможность создавать мое событие, однако при попытке просмотреть или изменить его я буду получать

SQLite3::SQLException: no such column: speakers.event_id: SELECT "speakers".* FROM "speakers" WHERE "speakers"."event_id" = ? 

И, конечно, нет колонки, созданной в базе данных.

>> s = Speaker.first 
=> nil 

Буду признателен за любую помощь или совет. Спасибо!

=====

ОБНОВЛЕНО для выпуска дупликации

События контроллера

def update 
    @event = Event.find(params[:id]) 

    if @event.update(event_params) 
     flash[:success] = "Event updated" 
     redirect_to @event 
    else 
     render @event 
    end 
    end 

event.rb

class Event < ActiveRecord::Base 

    belongs_to :type 

    has_many :categorizations 
    has_many :categories, through: :categorizations 
    has_many :speakers 
    accepts_nested_attributes_for :speakers, allow_destroy: true 

    @today = Date.today 

    def self.future_events 
    order('start_date ASC').where('start_date >= ?', @today) 
    end 

    scope :current_events, lambda { where('start_date < ? and end_date > ?', @today, @today) } 
    scope :past_events,  lambda { order('end_date DESC').where('end_date < ?', @today) } 

    scope :future_by_type, lambda { |type| order('start_date ASC').where('type_id = ? and start_date >= ?', type, @today) } 
    scope :current_by_type, lambda { |type| order('start_date ASC').where('type_id = ? and start_date < ? and end_date > ?', type, @today, @today) } 
    scope :past_by_type,  lambda { |type| order('start_date ASC').where('type_id = ? and end_date < ?', type, @today) } 

    validates :title, presence: true 

    mount_uploader :image, ImageUploader 

    before_save :define_end_date 
    before_save :zero_price 

    private 

     def define_end_date 
     self.end_date ||= self.start_date 
     end 

     def zero_price 
     if self.price.empty? 
      self.price = 0 
     end 
     end 
end 
+1

Вещи, чтобы проверить: Есть ли у вашей таблицы колонки 'event_id' колонки? Вы выполнили миграцию? – vee

+0

Если это была сильная проблема с параметрами, скорее всего, вы увидите сообщение об ошибке «unpermitted params -> params». Я бы посмотрел на таблицу db, как предлагает vinodadhika. – simonmorley

+0

@simonmorley добавление event_id в таблицу динамиков. Я не могу понять, почему это не упоминалось в документации для плагина. Теперь, однако, я столкнулся с новой проблемой: при редактировании и сохранении события с вложенными динамиками он дублирует их. Без возможности удаления. Сильные параметры снова? –

ответ

9

Теперь, когда я думаю об этом, это может быть связанными с сильными параметрами. Для обновления для работы вам необходимо также указать атрибуты id. В ваших параметрах разрешения добавьте id для speakers и любые другие вложенные вложенные ресурсы, которые будут обновляться.

Пожалуйста, дайте это попробовать:

def event_params 
    params.require(:event).permit(:title, :description, :type_id, :price, :program, 
           :start_date, :end_date, :image, category_ids: [], 
           speakers_attributes: [ :id, :name ]) 
end 
+2

Он работает! Однако у меня нет разрешения: id. Я также добавил '_destroy' к массиву speaker_attributes, так что теперь он выглядит так: speakers_attributes: [: id,: name, '_destroy'] Большое спасибо –

+0

Я добавлю: id к событию на всякий случай, хотя –

+0

@DenisG, пожалуйста. Не нужно добавлять: id на событие на всякий случай. Я уточню свой ответ. – vee