Как обойти правила проверки, установленные для вложенного атрибута в ruby ​​on rails?

У меня есть форма микросообщения, которая позволяет пользователю загружать фотографию и вводить к ней некоторый контент. Поле файла изображения является вложенным атрибутом моей фотомодели.

У него есть правило проверки «присутствие => истина». Для микропостов это не требуется. Пользователям разрешено публиковать микросообщения без изображений/фотографий.

Как бы то ни было, я использую одну и ту же фотомодель для галереи изображений пользователей, и фотография требуется во время отправки формы, поэтому я не могу отключить это правило.

Есть ли способ обойти правило проверки, установленное в моей фотомодели, когда я публикую форму микросообщения?

Контроллер:

  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"

Модель микропостов:

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

Фотомодель:

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

С уважением


person LondonGuy    schedule 12.05.2012    source источник
comment
Вопрос немного вводит в заблуждение. Проверка поля изображения не имеет значения, ваша запись в микросообщении должна просто разрешать не создавать фотографию из вложенных атрибутов фотографии, если изображение не загружено. Ответ Адама с reject_if является хорошим решением для этого.   -  person Viktor Trón    schedule 12.05.2012


Ответы (1)


Есть опция :reject_if, которую вы можете передать в accepts_nested_attributes_for, чтобы она не пыталась создать новую фотографию при определенных условиях. Это будет работать следующим образом:

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

Поскольку вы указали :id поля изображения как «micropost_image», вам, возможно, придется ссылаться на него в процедуре следующим образом:

attributes['micropost_image']

Один из этих двух должен работать.

person Adam    schedule 12.05.2012
comment
'micropost_image' - это идентификатор тега ввода файла в форме, не имеет значения. - person Viktor Trón; 12.05.2012
comment
Возможно, это не имеет значения, я думал, что атрибуты, существующие в блоке, исходят из формы. И я не был уверен, что рельсы анализируют атрибуты формы по тегу id или по тегу имени. Скорее всего, именной тег, хотя это может быть и идентификационный тег. - person Adam; 12.05.2012