Rails: Authlogic: невозможно обновить атрибуты пользователя. Поле пароля не может быть пустым.

У меня есть простая форма на странице пользователя, которая позволяет пользователю после входа в систему изменять некоторые атрибуты своего собственного объекта пользователя. Вид:

<% form_for @user, :url => {:controller => "teachers", :action => "update"} do |f| %>
    <%= f.error_messages %>
    <%= f.text_field :display_name %>
    <%= f.submit "Update" %>
<% end %>

Мне нужно указать URL-адрес, потому что это не стандартный контроллер RESTful. Контроллер обеспечивает

@user = current_user

к просмотру.

Затем действие update в контроллере пытается обработать сохранение:

@user = current_user
if @user.update_attributes(params[:user])
  flash[:notice] = "Successfully updated profile."
  redirect_to root_url
else
  render :action => 'edit'
end

Это должно обновить атрибут display_name объекта user, сохранить его в базе данных и перенаправить на root_url. Вместо этого действие edit снова отображается с сообщением error_messages формы, указывающим, что «пароль не может быть пустым».

Это явно то, с чем возится Authlogic! Ага! Вот весь мой Users.rb файл:

class User < ActiveRecord::Base
  acts_as_authentic do |c|
    c.transition_from_crypto_providers = Authlogic::CryptoProviders::MD5
    c.crypto_provider = Authlogic::CryptoProviders::Sha512
    c.validate_email_field = false
    c.require_password_confirmation = false
    c.ignore_blank_passwords = true
    c.validate_password_field = false
  end

  belongs_to :school

  validates_presence_of :first_name, :last_name, :email, :password
  validates_uniqueness_of :email, :scope => :email, :case_sensitive => false, :message => "is already in our database. Please contact us for help reactivating your account."

  ROLES = %w[admin teacher student]

  def role_symbols
    [role.to_sym]
  end
end

Как видите, я отключил почти все проверки Authlogic, которые смог найти, чтобы сохранить простоту и функциональность! По-прежнему не повезло. Если я добавлю password_field на страницу редактирования, он будет работать успешно, но он также обновит пароль пользователя, когда эта форма предназначена только для обновления их display_name!

Есть какие-нибудь советы о том, как обновить атрибуты объекта user без необходимости вводить пароль пользователя?


person Colin    schedule 05.03.2010    source источник
comment
Пожалуйста, покажите нам вашу текущую модель.   -  person Trevoke    schedule 08.03.2010
comment
Спасибо за терпение, Тревок. Я только что сообразил! Добавление всей модели к моему вопросу дало мне возможность вернуться и поэкспериментировать с другими потенциальными ловушками ... оказалось, что Authlogic вовсе не был проблемой. Проблема заключалась в моем validates_presence_of, который срабатывал всякий раз, когда я обновлял свой пользовательский объект. Я добавил условие :on => :create к валидации, и теперь все работает нормально. Я до сих пор не понимаю, почему эта проверка не жаловалась на то, что :first_name, :last_name или :email не были включены, но эй - теперь это работает! Еще раз спасибо.   -  person Colin    schedule 08.03.2010


Ответы (2)


Оказывается, проблема не в Authlogic. Проблема заключалась в моем validates_presence_of, который срабатывал всякий раз, когда я обновлял свой пользовательский объект. Я добавил условие :on => :create к валидации, и теперь все работает нормально.

person Colin    schedule 08.03.2010
comment
Проблема с этим решением заключается в том, что если у вас есть несколько атрибутов для вашего пользователя, и вы пытаетесь обновить один из других атрибутов, оставляя поля пароля пустыми, вы фактически измените свой пароль на. В идеале у вас есть способ не обновлять пароль, если поля остаются пустыми. - person Ryan Atallah; 24.08.2011

Вы пробовали это?

validate_password_field = false
person Trevoke    schedule 05.03.2010
comment
Пробовал! Не повезло. Все еще получаю Password can't be blank. - person Colin; 06.03.2010