gpt4 book ai didi

ruby-on-rails - 嵌套字段和强参数

转载 作者:行者123 更新时间:2023-12-03 16:06:22 26 4
gpt4 key购买 nike

我在 Rails 4 中遇到了一个复杂的问题,我将尝试在下面进行描述。我使用简单的形式和 awesome_nested_fields gems。

我有一堆事件 在我的应用程序中包含一些字段

这是我在实现 accepts_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 并使扬声器成为嵌套字段。

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

扬声器.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 %>

更新强参数的 Controller :
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

我将不胜感激任何帮助或建议。谢谢!

======

已更新重复问题

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

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

事件.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

最佳答案

现在想想,可能跟强参数有关。要使更新生效,您需要允许 id属性也。在您的许可参数中为 speakers 添加 ID以及将更新的任何其他正在使用的嵌套嵌套资源。

请试一试:

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

关于ruby-on-rails - 嵌套字段和强参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18308714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com