2010-03-05 1 views
2

У меня есть простая форма на странице пользователя, которая позволяет пользователю после входа в систему изменять некоторые атрибуты для собственного пользователя объект. Вид: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 

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

Это явно то, с чем сталкивается Authlogic! Ack! Вот посмотрите на весь мой 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 без необходимости передавать пароль пользователя?

+0

Пожалуйста, покажите нам свою текущую модель. – Trevoke

+0

Благодарим за ваше терпение, Тревук. Мне просто удалось это понять! Добавление всей модели к моему вопросу дало мне возможность вернуться и экспериментировать с другими потенциальными ловушками ... оказалось, что Authlogic не была проблемой вообще. Проблема заключалась в моем 'validates_presence_of', который срабатывал всякий раз, когда я обновлял свой пользовательский объект. Я добавил к проверке условие ': on =>: create', и теперь все работает нормально. Я до сих пор не понимаю, почему эта проверка не жаловалась на ': first_name',': last_name' или ': email', которые не включаются, но hey-it работает сейчас! Еще раз спасибо. – Colin

ответ

4

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

+2

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

0

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

validate_password_field = false 
+0

Пробовал! Не повезло. Все равно получение пароля не может быть пустым. – Colin