Получить скрепку, чтобы обрезать изображение без проверки - PullRequest
1 голос
/ 28 апреля 2010

Привет, коллеги, члены stackoverflow.

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

Но я столкнулся с небольшой проблемой. Когда пользователь обрезает изображение, модель пытается проверить все мои проверки. Моя пользовательская модель выглядит так:

class User < ActiveRecord::Base

  has_attached_file :avatar, :styles => { :small => "100x100>", :large => "500x500>" }, :processors => [:cropper]

  attr_accessor :password, :crop_x, :crop_y, :crop_w, :crop_h
  attr_accessible :crop_x, :crop_y, :crop_w, :crop_h
  validates_confirmation_of :password
  validates_presence_of :password

И когда пользователь запускает скрипт обновления обрезки, модель user пытается проверить пароль. Но поскольку у меня нет поля пароля на странице обрезки, оно не может его проверить.

Вот обновление урожая:

@user = User.find(current_user.id)
  if @user.update_attributes(params[:user])
    flash[:notice] = "Successfully updated user."
  end

Как я могу обойти это простым и чистым способом?

Ответы [ 4 ]

0 голосов
/ 28 апреля 2010

Позвоните #save и передайте его false, чтобы отключить проверки для этого одного обновления базы данных.

Измените свой код контроллера на это:

@user = User.find(current_user.id)
@user.attributes = params[:user]
if @user.save(false)
    flash[:notice] = "Successfully updated user."
end

Это может вызвать проблемы, если вы полагаетесь на Paperclip для проверки изображения. Это может скрывать некоторые проблемы с плохо отформатированными файлами изображений, но, возможно, оно того стоит.

0 голосов
/ 28 апреля 2010

Основываясь на методике, используемой authlogic , попробуйте проверить пароль только тогда, когда это новая запись, пароль был изменен или зашифрованный пароль (столбец, в котором хранится хешированный / зашифрованный пароль), пуст .

class User
  validates_confirmation_of :password, :if => :require_password?
  validates_presence_of :password, :if => :require_password?

  def password=(pass)
    return if pass.blank?

    # Encrypt password, etc
    # ...

    @password_changed = true
  end


  private
    def require_password?
      new_record? || @password_changed || crypted_password.blank?
    end
end
0 голосов
/ 28 апреля 2010

Подобный ответ @htanata, но с использованием ActiveRecord: Dirty :

class User
  validates_confirmation_of :password, :if => 'self.password_changed?'
  validates_presence_of :password, :if => 'self.password_changed?'
end
0 голосов
/ 28 апреля 2010

Попробуйте условную проверку:

validates_confirmation_of :password, :if => :password
validates_presence_of :password, :if => :password
...