【问题标题】:nested form associated model getting autosaved嵌套表单关联模型自动保存
【发布时间】:2016-02-10 08:00:37
【问题描述】:

我的关联模型会自动保存。我希望仅当这些字段包含任何值时才会发生这种情况。显然reject_if 是解决这个问题的方法,但我无法让它工作。我已经尝试过:new_record? 以及传入 Proc。但我怀疑这里还有其他问题,因为下面的 reject_posts 方法没有被调用。

has_one :reservation, as: :reservable,  autosave: false,
                      class_name: Booking::Reservation
accepts_nested_attributes_for :reservation, reject_if: :reject_posts

def reject_posts(attributed)
  binding.pry
end

我将如何尝试调试这个?

【问题讨论】:

  • 你能把autosave: false删掉,如果它被调用试试看?
  • 它也不会被调用。

标签: ruby-on-rails nested-attributes


【解决方案1】:

我将如何尝试调试这个?

第一步是确保您的流程正在调用accepts_nested_attributes_for 方法。

简单的检查是确定您的请求控制台日志是否将参数发送为...

parameters: {
   "model" => {
     "reservation_attributes" => {...}
   }
} 

如果您的参数不包含_attributes,则您的fields_for 或流程不正确。

--

您还应该确保您的class_name 选项通过string

has_one :reservation, as: :reservable, class_name: "Booking::Reservation"

我个人会做以下事情:

#app/models/model.rb
class Model < ActiveRecord::Base
  has_one :reservation, as: :reservable, class_name: "Booking::Reservation", inverse_of: :model
  accepts_nested_attributes_for :reservation, reject_if: :all_blank?
end

“拒绝”是not validation。它只是防止关联的对象被传递给嵌套模型...

您也可以设置一个:reject_if proc 以静默忽略任何新的记录哈希,如果它们未能通过您的标准

我会在另一个模型上使用验证(inverse_of):

#app/models/reservation.rb
class Reservation < ActiveRecord::Base
  belongs_to :model, inverse_of: :reservation
  validates :x, :y, :z, presence: true
end

--

如果您想根据特定属性为空来拒绝,您应该使用:

#app/models/model.rb
class Model < ActiveRecord::Base
  has_one :reservation, as: :reservable, class_name: "Booking::Reservation"
  accepts_nested_attributes_for :reservation, reject_if: proc { |a| a['name'].blank? || a['title'].blank? }
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多