У меня сложная проблема в 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
Вещи, чтобы проверить: Есть ли у вашей таблицы колонки 'event_id' колонки? Вы выполнили миграцию? – vee
Если это была сильная проблема с параметрами, скорее всего, вы увидите сообщение об ошибке «unpermitted params -> params». Я бы посмотрел на таблицу db, как предлагает vinodadhika. – simonmorley
@simonmorley добавление event_id в таблицу динамиков. Я не могу понять, почему это не упоминалось в документации для плагина. Теперь, однако, я столкнулся с новой проблемой: при редактировании и сохранении события с вложенными динамиками он дублирует их. Без возможности удаления. Сильные параметры снова? –