3

我有两个模型,第一个模型 ( model_1) 接受第二个模型 ( ) 的嵌套属性model_2。第二个模型只有一个字段 ( file),在表单中作为文件字段引用。

没有选择文件时,问题就来了。在这种情况下——除了一个文本字段——该字段根本不会出现在具有第一个模型的 POST 参数中,它认为根本不应该创建任何嵌套模型。哪个无法触发验证等。如果我要向 model_2 和相应的表单添加第二个字段,并且如果我使用的是文本输入,那么一切都会顺利进行,并且文件字段的验证自然也可以正常工作。

任何人都有如何去做这件事的经验?

为了更好地使用一些(简化的)代码 - 形式:

= form_for @model_1, :html => { :multipart => true } do |f|
    - # fields for model 1 …
    = f.fields_for :model_2 do |builder|
        - # if this is empty, it's like no model_2 would be created at all:
        = builder.file_field :file

型号 1:

class Model1 < ActiveRecord::Base
    has_many :model_2s, :dependent => :destroy
    accepts_nested_attributes_for :model_2s
    # …
end

和模型 2:

class Model2 < ActiveRecord::Base
    belongs_to :model_1
    validates_presence:of :file
    # …
end
4

2 回答 2

1

如果文件字段丢失,我建议在您的控制器中添加一个检查并返回一个 flash[:error] 消息。

如果字段不存在,您也可以手动添加字段,以便触发验证:

m1params = 参数[:model_1]
m1params[:model_2_attributes] = {} 除非 m1params.has_key?(:model_2_attributes)

最后,您可以在您的 model_2 模型中创建一个虚假属性,您可以使用它来确保 model_2_attributes 以以下形式传递:

类模型2
  attr_writer :假的

  假的
    @fake ||= '默认'
  结尾
结尾

= form_for @model_1, :html => { :multipart => true } 做 |f|
    - # 模型 1 的字段…
    = f.fields_for :model_2 做 |builder|
        = builder.hidden_​​field :fake
        = builder.file_field:文件
于 2011-02-05T23:10:53.307 回答
0

最后,这似乎回答了:

https://github.com/perfectline/validates_existence

这是一个示例:

class Unicorn < ActiveRecord::Base
  belongs_to :wizard
  belongs_to :person, :polymorphic => true

  validates :wizard,    :existence => true
  validates :wizard_id, :existence => true # works both way
  validates :person,    :existence => { :allow_nil => true, :both => false }
end
于 2011-02-06T22:45:25.660 回答