Разработать обновление пользователя без пароля - PullRequest
73 голосов
/ 25 февраля 2011

Я хочу обновить атрибуты пользователей без пароля в devise. Дело в том, что если поля пароля и подтверждения пароля не пустые, то мне нужно разработать ошибку, а если они пустые, то другие атрибуты пользователя необходимо обновить. Как я могу сделать это с помощью устройства?

Заранее спасибо!

Ответы [ 14 ]

0 голосов
/ 15 февраля 2018

После долгих исследований вышеуказанных возможностей я наконец нашел решение, которое позволяет обновлять некоторые атрибуты без пароля, а некоторые с помощью:

Я создал представление для пользователя / edit.html.erb со следующей формой в нем.

<%= form_for(@user) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <%= f.label :name %>
  <%= f.text_field :name, class: 'form-control' %>

  <%= f.submit "Save changes"%>
<% end %>

Я устанавливаю маршруты в route.rb

resources :users, only: [:show, :index, :edit, :update]

Я сделал методы редактирования и обновления в users_controller.rb

def edit
  @user = current_user
end

def update
  @user = current_user
  if @user.update_attributes(user_params)
    flash[:success] = "Profile updated"
    redirect_to root_url
  else
    render 'edit'
  end
end


def user_params
  params.require(:user).permit(:name, :avatar, :whatsup)
end

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

edit_user_path(current_user)

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

edit_user_registration_path(current_user)

Я признаю, что это огромная работа, но ни одно из более простых решений не решило все вышеперечисленные проблемы.

0 голосов
/ 14 октября 2017

Мне легче понять эту небольшую вариацию кода выше:

def update
  @user = User.find(params[:id])

  method = if user_params[:password].blank?
             :update_without_password
           else
             :update_with_password

  if @user.send(method, user_params)
    redirect_to @user, notice: 'User settings were saved.'
  else
    render :edit
  end
end
0 голосов
/ 29 августа 2016

У меня была точно такая же проблема, и это решение, которое я придумал, и поверьте мне, оно работает.Что я сделал, так это создал второй user_params метод и назвал его user_params_no_pass. В любом случае, посмотрите, что происходит: администратор предоставит пароль, когда его нужно будет обновить, иначе оставьте пароль пустым.когда пароль пуст, user_params_no_pass используется иначе user_params.Я надеюсь, что это помогает

    def update

    if @user.valid_password?(params[:user][:password])
          respond_to do |format|

            if @user.update(user_params)
              format.html { redirect_to @user, notice: 'User profile was successfully updated.' }
              format.json { render :show, status: :ok, location: @user }
            else
             format.html { render :new }
             format.json { render json: @user.errors, status: :unprocessable_entity }
            end
          end
    else
      respond_to do |format|

            if @user.update(user_params_no_pass)
              format.html { redirect_to @user, notice: 'User profile was successfully updated without password.' }
              format.json { render :show, status: :ok, location: @user }
            else
              format.html { render :edit }
              format.json { render json: @user.errors, status: :unprocessable_entity }
            end
          end
    end
  end

  def destroy
     @user.destroy
      respond_to do |format|
        format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
        format.json { head :no_content }
      end
  end
  private

    def set_user
      @user = User.find(params[:id])
    end

    def user_params
      params.require(:user).permit(:user_name, :first_name, :middle_name, :last_name, :dob, :gender, :race, :hispanic, :leader, :mentor, :student, :email, :organization_id, :password, :opus,
  :release_date, :days_to_release, :current_level, :is_active)
    end


    def user_params_no_pass
      params.require(:user).permit(:user_name, :first_name, :middle_name, :last_name, :dob, :gender, :race, :hispanic, :leader, :mentor, :student, :email, :organization_id, :opus,
  :release_date, :days_to_release, :current_level, :is_active)
    end
0 голосов
/ 18 марта 2016

Это больше бизнес-логика, поэтому я не буду помещать слишком много кода в контроллер.Я предлагаю переопределить Devise::Models::Validatable#password_required? в вашей модели:

def password_required?
  new_record? || password.present? || password_confirmation.present?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...