0

私はユーザーが写真をアップロードし、それに付随するいくつかのコンテンツを入力できるマイクロポストフォームを持っています。画像ファイルフィールドは、写真モデルのネストされた属性です。Ruby on Railsのネストされた属性に対して設定された検証ルールを回避するにはどうすればよいですか?

これは、検証ルール "presence => true"を持っています。これは、マイクロポストには必要ありません。ユーザーは画像/写真無しのマイクロポストを投稿することができます。

私はどのようにユーザーの画像ギャラリーに同じ写真モデルを使用し、フォーム提出時に写真が必要なので、このルールを無効にすることはできません。

マイクロポストフォームを投稿したときに、自分の写真モデルに設定された検証ルールをバイパスする方法はありますか?

コントローラー:

def new 
    @user = User.new 
    @micropost = Micropost.new(:user_id => users_id) 
    @micropost.build_photo(:photo_album_id => current_user.photo_albums.find_by_album_title("microposts album").id) 
    end 

フォーム:

= form_for @micropost, :html => { :multipart => true }, :remote => true do |f| 
    = f.fields_for :photo do |p| 
     = p.hidden_field :photo_album_id 
     = p.text_field :photo_title 
     = p.file_field :image, :id => "micropost_image" 
    = f.hidden_field :user_id 
    = f.text_area :content 
     = f.submit "Post" 

Micropostモデル:

class Micropost < ActiveRecord::Base 

    belongs_to :user 
    has_many :comments, :dependent => :destroy 
    has_one :photo, :dependent => :destroy 


    accepts_nested_attributes_for :photo 

    attr_accessor :username 
    attr_accessible :content, :user_id, :poster_id, :username, :remote_image_url, :photo_attributes 

    validates :content, :presence => true, :length => { :maximum => 10000 } 
    validates :user_id, :presence => true 


end 

写真モデル:それは一定の条件の下で新しい写真を作成しようとしないようにreject_ifは、あなたがaccepts_nested_attributes_forに渡すことができます:

class Photo < ActiveRecord::Base 


    belongs_to :photo_album 

    attr_accessible :photo_album_id, :photo_title, :image, :remote_image_url 
    mount_uploader :image, ImageUploader 

    alpha_num_non_word_char = /^[a-zA-Z0-9\D_ -]*$/ 

    validates :image, :presence => true 
    validates :photo_title, :length => { :minimum => 2, :maximum => 50 }, 
           :format => { :with => alpha_num_non_word_char, 
              :message => "error" 
             }, :if => :photo_title?  
    validate :picture_size_validation, :if => "image?" 

    def picture_size_validation 
    errors[:image] << "Your photo should be less than 1MB" if image.size > 1.megabytes 
    end 

end 

種類オプションは、あります

+0

質問は少し間違っています。画像フィールドの検証は無関係です。画像がアップロードされていない場合、マイクロポストの入力で写真のネストされた属性から写真を作成しないようにするだけです。 reject_ifを使ったAdamの答えは、このための良い解決策の1つです。 –

答えて

2

について。それはこのように動作します:

accepts_nested_attributes_for :photo, :reject_if => proc { |attributes| attributes['image'].blank? } 

あなたが指定したので:「をmicropost_image」であるとして画像フィールドのID、あなたの代わりにこのようなprocの中でそれを参照する必要があるかもしれません:

attributes['micropost_image'] 

ワンその2人のうちの1人は働きます。

+0

'micropost_image'は、フォームに含まれていないファイル入力タグのIDです。 –

+0

ブロックに存在する属性がフォームから来ていると私は考えていましたが、無関係かもしれません。そして、レールがIDタグか名前タグによってフォームから属性を解析しているかどうかはわかりませんでした。おそらく名前タグですが、idタグかもしれません。 – Adam

+0

大変感謝しました。 – LondonGuy

関連する問題