2013-03-08 2 views
25

Я использую ActiveAdmin в качестве моего бэкэнда для администрирования в своем приложении rails. В принципе, у меня есть admin_user и пользовательская модель.ActiveAdmin: как оставить пароль пользователя без изменений?

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

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

Есть ли конфигурация где-то, которая учитывала бы, что пароль не изменяется, являются ли поля (password и password_confirmation) пустыми при обновлении пользователя?

+0

Вы используете устройство для аутентификации? –

+0

Что значит 'кажется? вы получаете ошибки проверки, или что? – phoet

+0

Да, я использую устройство. «Кажется» означает, что я не нашел способ сделать это, поскольку поле пароля не может быть пустым. – Luc

ответ

20

Devise предоставляет метод update_without_password, который вы можете использовать при обновлении пользователя, если пароль не введен. Используя этот метод, вы можете настроить метод обновления в своем контроллере пользователей ActiveAdmin.

def update 
    @user = User.find(params[:id]) 
    if params[:user][:password].blank? 
    @user.update_without_password(params[:user]) 
    else 
    @user.update_attributes(params[:user]) 
    end 
    if @user.errors.blank? 
    redirect_to admin_users_path, :notice => "User updated successfully." 
    else 
    render :edit 
    end 
end 

Devise Wiki имеет больше информации об этом методе, если ваш интерес.

+0

Да, и вот еще один способ сделать это http://stackoverflow.com/a/11676957/633742 –

85

Вам не нужно возиться вообще с регистрационным контроллером DEViSE, вы можете просто игнорировать пустые поля пароля внутри контроллера ресурсов ActiveAdmin в:

ActiveAdmin.register User do 

    controller do 

    model = :user 

    if params[model][:password].blank? 
     %w(password password_confirmation).each { |p| params[model].delete(p) } 
    end 

    super 

    end 

end 
+1

Вы правы, это, вероятно, намного чище и локализовано. – Luc

+2

Элегантный! Спасибо, что поделился. – scarver2

+2

Где я могу найти этот файл? это нормально, чтобы положить его в 'config/initializers/rails_admin.rb'? –

9

Вы должны оценить пароль и password_confirmation в если заявление, применять валидации на «password_confirmation», например, для моего случая:

#app/admin/user.rb 
controller do 
    def update 
    if params[:user][:password].blank? && params[:user][:password_confirmation].blank? 
     params[:user].delete("password") 
     params[:user].delete("password_confirmation") 
    end 
    super 
    end 
end 


#app/model/user.rb 
validates :name, :email, presence: true 
validates :password, :password_confirmation, presence: true, on: :create 
validates :password, confirmation: true 

Это позволяет мне проверить наличие пароля только при создании нового пользователя и обновления без изменения его пароля.

Эта работа для меня, надеюсь, это полезно.

Надеюсь, это полезно.

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