The*_* Oz 5 ruby-on-rails ruby-on-rails-4
我在Rails 4中遇到了一个复杂的问题,我将在下面介绍.我使用简单的形式和awesome_nested_fields宝石.
我的应用程序中有一些带有一些字段的事件
这是我在working_nested_attributes实现之前的工作event_controller参数:
private
def event_params
params.require(:event).permit(:title, :description, :type_id, :price, :program,
:start_date, :end_date, :image, category_ids: [])
end
Run Code Online (Sandbox Code Playgroud)
现在我想在我的活动中添加一些发言者,并让用户决定每个活动他想要多少个发言者.因此,根据他们的文档,我添加了嵌套字段gem并使扬声器成为嵌套字段.
Event.rb
class Event < ActiveRecord::Base
has_many :speakers
accepts_nested_attributes_for :speakers, allow_destroy: true
end
Run Code Online (Sandbox Code Playgroud)
Speaker.rb
class Speaker < ActiveRecord::Base
belongs_to :event
end
Run Code Online (Sandbox Code Playgroud)
添加扬声器(在我的添加事件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 %>
Run Code Online (Sandbox Code Playgroud)
更新强参数的控制器:
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
Run Code Online (Sandbox Code Playgroud)
现在,当我启动我的应用程序时,在创建新事件时,我得到了:
can't write unknown attribute `event_id'
Run Code Online (Sandbox Code Playgroud)
如果我删除了
speakers_attributes: [ :name ]
Run Code Online (Sandbox Code Playgroud)
从强大的参数我将能够创建我的事件,但是当我试图查看或编辑它时,我会得到
SQLite3::SQLException: no such column: speakers.event_id: SELECT "speakers".* FROM "speakers" WHERE "speakers"."event_id" = ?
Run Code Online (Sandbox Code Playgroud)
当然,数据库中没有创建扬声器.
>> s = Speaker.first
=> nil
Run Code Online (Sandbox Code Playgroud)
我将不胜感激任何帮助或建议.谢谢!
=====
更新了重复问题
事件控制器
def update
@event = Event.find(params[:id])
if @event.update(event_params)
flash[:success] = "Event updated"
redirect_to @event
else
render @event
end
end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
vee*_*vee 12
现在我考虑一下,它可能与强参数有关.要使更新生效,您还需要允许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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12914 次 |
| 最近记录: |