2

ここに投稿された他のソリューションに従おうとして24時間以上これに固執してきましたが、これを機能させることができません. Rails は初めてで、助けが必要です。

/users/edit ページを機能させて、ユーザーのパスワードを簡単に変更できるようにしたいと考えています。本来は current_password なしでやりたかったのですが、パスワードの変更・更新ができるのであれば入れたままでも構いません。

これが私がしたことです:

Devise Wikiの例に従い、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 はありませんでした)...

何か案は?

4

1 に答える 1

3

次のようなことを試してください: ログインしているユーザーのパスワードを忘れた場合の工夫

これにより、パスワードを変更するための別のビューを使用できます。

重要なのは、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/routes.rb

resource :users do
  post 'do_reset_password'
end
于 2012-02-22T04:25:36.803 に答える