ruby-on-rails – 嵌套字段和强参数
发布时间:2020-12-17 04:01:18 所属栏目:百科 来源:网络整理
导读:我在Rails 4中遇到了一个复杂的问题,我将在下面介绍.我使用简单的形式和awesome_nested_fields宝石. 我的应用程序中有一些带有一些字段的事件 这是我在working_nested_attributes实现之前的工作event_controller参数: private def event_params params.requ
我在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 现在我想在我的活动中添加一些发言者,并让用户决定每个活动他想要多少个发言者.因此,根据他们的文档,我添加了嵌套字段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,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 > ?',@today) } scope :past_by_type,lambda { |type| order('start_date ASC').where('type_id = ? and end_date < ?',@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 解决方法
现在我考虑一下,它可能与强参数有关.要使更新生效,您还需要允许id属性.在您的许可证参数中添加扬声器的ID以及将要更新的任何其他嵌套的嵌套资源.
请尝试一下: def event_params params.require(:event).permit(:title,speakers_attributes: [ :id,:name ]) end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |