3

私は2つのモデルを持っています。最初のモデル(model_1)は2番目のモデル()のネストされた属性を受け入れますmodel_2。2番目のモデルにはフィールド(file)が1つだけあり、ファイルフィールドとしてフォームで参照されます。

この問題は、ファイルが選択されていない場合に発生します。この場合、たとえばテキストフィールドを除いて、このフィールドはPOSTパラメータにまったく表示されません。最初のモデルでは、ネストされたモデルはまったく作成されるべきではないと考えられます。これは検証などをトリガーできません。model_2と対応するフォームに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 = params[:model_1]
m1params[:model_2_attributes] = {} not m1params.has_key?(:model_2_attributes)

最後に、model_2 モデルに偽の属性を作成して、model_2_attributes が次の形式で確実に渡されるようにすることができます。

クラス Model2
  attr_writer :偽物

  デフフェイク
    @fake ||= 'デフォルト'
  終わり
終わり

= form_for @model_1, :html => { :multipart => true } do |f|
    - モデル 1 の # フィールド …
    = f.fields_for :model_2 do |ビルダー|
        = builder.hidden_​​field :偽物
        = 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 に答える