私はユーザーが写真をアップロードし、それに付随するいくつかのコンテンツを入力できるマイクロポストフォームを持っています。画像ファイルフィールドは、写真モデルのネストされた属性です。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
種類オプションは、あります
質問は少し間違っています。画像フィールドの検証は無関係です。画像がアップロードされていない場合、マイクロポストの入力で写真のネストされた属性から写真を作成しないようにするだけです。 reject_ifを使ったAdamの答えは、このための良い解決策の1つです。 –