Разработать: изменить пароль - PullRequest
2 голосов
/ 22 февраля 2012

Я застрял на этом более 24 часов, пытаясь следовать другим решениям, опубликованным здесь, но я не могу заставить это работать. Я новичок в Rails и мне нужна помощь!

Я хочу, чтобы моя страница / users / edit работала так, чтобы я мог просто изменить пароль пользователя. Первоначально я хотел сделать это без current_password, но я не против оставить его там до тех пор, пока смогу изменить и обновить пароль.

Вот что я сделал:

Я последовал примеру в Devise Wiki и вставил его в свой контроллер Users, который я указал для наследования от Devise :: RegistrationsController

class UsersController < Devise::RegistrationsController
  ...
end

Я изменил свои маршруты:

devise_for :users, :controllers => { :registrations => 'users' } do 
  match '/users' => 'users#index'
end

А вот и моя модель:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessor :password, :password_confirmation, :current_password
  attr_accessible :email, :password, :password_confirmation, :current_password,      :remember_me, :full_name, :coach, :bio 

  validates :full_name, presence: true

end

Я предполагал, что созданный мной UsersController переопределит контроллер Registrations и что я смогу изменить / обновить пароль. Он работает в той степени, в которой происходит перенаправление на root_path (что должно происходить только после обновления без текущего пароля), но новый пароль не сохраняется (я проверил журналы и не было SQL, чтобы показать, что он был сохранен) ...

Есть идеи?

1 Ответ

3 голосов
/ 22 февраля 2012

Попробуйте сделать что-то похожее на: Разработать забытый пароль для зарегистрированного пользователя

Это позволяет вам иметь отдельное представление для смены пароля.

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

добавьте это в свою пользовательскую форму, где вы хотитеиметь возможность редактировать пароль:

<%= form_for(@user, :url => url_for(:action => :do_reset_password) , :html => { :method => :post }) do |f| %>

  <%= f.hidden_field :reset_password_token %>

  <div><%= f.label :password, "New password" %><br />
  <%= f.password_field :password %></div>

  <div><%= f.label :password_confirmation, "Confirm new password" %><br />
  <%= f.password_field :password_confirmation %></div>

  <div><%= f.submit "Change my password" %></div>
<% end %>

пользовательский контроллер:

    def do_reset_password
        id = params[:id]

        # there may be a better way of doing this, devise should be able to give us these messages
        if params[:user][:password] != params[:user][:password_confirmation]
            flash[:alert] = "Passwords must match." 
              redirect_to :back
              return
        end
        if @user.reset_password!(params[:user][:password],params[:user][:password_confirmation])
            @user.save
            respond_to do |format|
                format.html { redirect_to '/home', notice: 'Your password has been changed.' }
            end
        else
            flash[:alert] = "Invalid password, must be at least 6 charactors." 
              redirect_to :back 
        end
    end

config / rout.rb

resource :users do
  post 'do_reset_password'
end
...