1

Я модели профиляЗапуск только Скрепка валидация в Rails

class Profile < Abstract 
    has_attached_file :avatar,     
    ... 
    validates_attachment_size :avatar, :less_than => 2.megabytes 
    validates_attachment_content_type :avatar, :content_type => ['image/jpeg', 'image/png', ...] 
    # Many other validations 
end 

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

class Abstract < ActiveRecord::Base 
    def self.valid_attribute?(attr, value) 
     mock = self.new(attr => value) 
     unless mock.valid? 
      return !mock.errors.has_key?(attr) 
     end 
     true 
    end 
end 

и контроллер

def update_avatar 
    if params[:profile] && params[:profile][:avatar].present? && Profile.valid_attribute?(:avatar, params[:profile][:avatar]) 
     @profile.avatar = params[:profile][:avatar] 
     @profile.save(:validate => false) 
     ... 
    else 
     flash.now[:error] = t :image_save_failure_message 
     render 'edit_avatar' 
    end 
end 

Но это не сработало для скрепкой. всегда возвращает true.

ответ

0

Вместо того, чтобы пытаться сделать все это волшебство, создать отдельный образ или аватар модель, которая собирается быть ваша модель изображения, например:

class Attachment < ActiveRecord::Base 

    belongs_to :owner, :polymorphic => true 

    has_attached_file :file, 
       :storage => :s3, 
       :s3_credentials => "#{Rails.root}/config/s3.yml", 
       :s3_headers => {'Expires' => 5.years.from_now.httpdate}, 
       :styles => { :thumbnail => "183x90#", :main => "606x300>", :slideshow => '302x230#', :interview => '150x150#' } 

    def url(*args) 
    self.file.url(*args) 
    end 

end 

После того как вы это, создать отношения:

class Profile < Abstract 
    has_one :attachment, :as => :owner, :dependent => :destroy 
end 

Тогда в вашей форме, вы сохраните вложение первого, независимо от модели, а затем попытаться сохранить профиль установки приложения к нему. Может быть что-то вроде этого:

def create 

    @attachment = if params[:attachment_id].blank? 
    Attachment.create(params[:attachment) 
    else 
    Attachment.find(params[:attachment_id]) 
    end 

    @profile = Profile.new(params[:profile]) 
    @profile.image = attachment unless attachment.new_record? 
    if @profile.save 
    # save logic here 
    else 
    # else logic here 
    end 
end 

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

+0

спасибо. Я рассматривал это как возможное решение. Но мне нужно решение без отдельной модели –

 Смежные вопросы

  • Нет связанных вопросов^_^