Вопрос

Я добавляю функцию сброса пароля в приложение My Rails, которое использует authLogic. Я следил за руководством здесь: http://www.binarylogic.com/2008/11/16/0/tutorial-reset-passwords-with-with-with- И все работает, как я бы хотел, кроме как только для одной вещи: форма сброса пароля принимает пустые пароли и просто не меняет их.

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

1) Кто-то задал этот же вопрос в группах Google:

Модель пользователя сохраняет пустой пароль

Ответ Бена должен был использовать @user.validate_password = true Чтобы заставить проверку пароля. Я попробовал это, но я получаю неопределенный метод ошибки: undefined method 'validate_password_field=' for #<User>.

2), кажется, вызывается опция конфигурации authLogic ignore_blank_passwords. Отказ Здесь документировано:

Модуль: authLogic :: actsasauthentic :: Пароль :: config # lightore_blank_Passwords

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

Кто-нибудь нашел решение этого? я понимаю validate_password= В журнале изменений для authLogic 1.4.1 и ничего об этом не удалось с тех пор. Я просто использую его неправильно? Есть ли способ использовать ignore_blank_passwords на основании за запрос?

Это было полезно?

Решение

Это то, что я сделал.

class User < ActiveRecord::Base
  attr_accessor :ignore_blank_passwords

  # object level attribute overrides the config level
  # attribute
  def ignore_blank_passwords?
    ignore_blank_passwords.nil? ? super : (ignore_blank_passwords == true)
  end
end

Теперь в вашем контроллере установите ignore_blank_passwords атрибут false.

user.ignore_blank_passwords = false

Здесь вы работаете в пределах authLicic. Вам не нужно менять логику проверки.

Другие советы

Это своего рода старая нить, но так как он не содержится в без ответа, я опубликую это.

Мне удалось сделать это немного более чистые, чем другие решения, «помогая» авторитетные проверки самостоятельно.

Я добавил это пользователю:

class User < ActiveRecord::Base

  ...

  attr_writer :password_required

  validates_presence_of :password, :if => :password_required?

  def password_required?
    @password_required
  end

  ...
end

Вы можете уменьшить его до двух строк, сделав attr_accessor и использовать :if => :password_required (Нет допроса), но я предпочитаю этот другой синтаксис с помощью знака допроса.

Тогда действие вашего контроллера можно сделать подобное:

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]
  @user.password_required = true

  if @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

Это будет иметь местный эффект; Остальная часть приложения не будет затронута (если password_required установлен в истину в других местах, то есть).

Я надеюсь, что это помогает.

User.ignore_blank_passwords = false

Используйте модель, а не объект для настройки этого свойства.

def update_passwords
  User.ignore_blank_passwords = false
  if @user.update_attributes(params[:user])
    ...
  end
  User.ignore_blank_passwords = true
end

Может быть, проверьте значение параметра в контроллере? (Воздушный код):

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]
  if @user.password.blank?
    flash[:error] = "Password cannot be blank"
    render :action => :edit
    return
  end
  if @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

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

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]

  if @user.changed? && @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

Вы в основном проверяете, изменял ли authLogic Record user (который не так, если пароль пуст). В остальном блоке вы можете проверить, был ли пароль пустым и добавить соответствующее сообщение об ошибке для записи пользователя или отобразить вспышку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top