2017-03-21 15 views
0

How To: Allow users to edit their password」を参照として初めてサインインした後にパスワードリセットを実装しようとしています。Devitsを使用して初めてログインした後にパスワードをリセットする方法

私は、次のエラーを取得しています:

Routing Error 

No route matches [GET] "/user/update_password" 

は、私は記事の最後に完全なトレースを追加しました。

私には何が欠けていますか?

私はRails '4.2.6'を使用しています。

アプリケーションコントローラ:

class ApplicationController < ActionController::Base 
    after_filter :reset_last_captcha_code! 
    protect_from_forgery with: :exception 


    def after_sign_in_path_for(resource) 
    if current_user.sign_in_count == 1 
     update_password_user_path 
    else 
     root_path 
    end 
    end 
end 

ビュー:

<%= form_for(@user, :url => { :action => "update_password" }) do |f| %> 
    <div class="field"> 
    <%= f.label :password, "Password" %><br /> 
    <%= f.password_field :password, :autocomplete => "off" %> 
    </div> 
    <div class="field"> 
    <%= f.label :password_confirmation %><br /> 
    <%= f.password_field :password_confirmation %> 
    </div> 
    <div class="action_container"> 
    <%= f.submit %> 
    </div> 
<% end %> 

ルート:

resource :user, only: [:edit] do 
    collection do 
     patch 'update_password' 
    end 
    end 

ユーザーモデル:

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

完全なトレース:

actionpack (4.2.6) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call' 
web-console (2.3.0) lib/web_console/middleware.rb:28:in `block in call' 
web-console (2.3.0) lib/web_console/middleware.rb:18:in `catch' 
web-console (2.3.0) lib/web_console/middleware.rb:18:in `call' 
actionpack (4.2.6) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
railties (4.2.6) lib/rails/rack/logger.rb:38:in `call_app' 
railties (4.2.6) lib/rails/rack/logger.rb:20:in `block in call' 
activesupport (4.2.6) lib/active_support/tagged_logging.rb:68:in `block in tagged' 
activesupport (4.2.6) lib/active_support/tagged_logging.rb:26:in `tagged' 
activesupport (4.2.6) lib/active_support/tagged_logging.rb:68:in `tagged' 
railties (4.2.6) lib/rails/rack/logger.rb:20:in `call' 
actionpack (4.2.6) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
rack (1.6.5) lib/rack/methodoverride.rb:22:in `call' 
rack (1.6.5) lib/rack/runtime.rb:18:in `call' 
activesupport (4.2.6) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call' 
rack (1.6.5) lib/rack/lock.rb:17:in `call' 
actionpack (4.2.6) lib/action_dispatch/middleware/static.rb:120:in `call' 
rack (1.6.5) lib/rack/sendfile.rb:113:in `call' 
railties (4.2.6) lib/rails/engine.rb:518:in `call' 
railties (4.2.6) lib/rails/application.rb:165:in `call' 
rack (1.6.5) lib/rack/lock.rb:17:in `call' 
rack (1.6.5) lib/rack/content_length.rb:15:in `call' 
rack (1.6.5) lib/rack/handler/webrick.rb:88:in `service' 
/Users/jj/.rbenv/versions/2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' 
/Users/jj/.rbenv/versions/2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' 
/Users/jj/.rbenv/versions/2.3.0/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread' 
+0

に変換する方法の詳細については

devise_for :users 

あなたは '/ユーザー/ update_password'に直接移動しようとしているroutes.rbの代わりにあなたのブラウザで?このチュートリアルでは、あなたのビューコードを 'user/edit'に入れ、そこであなたのパスワードを更新するつもりです。 – eiko

+0

ビュー内の@eiko私はuserと呼ばれるフォルダを作成し、編集テンプレートを追加しました。 – evanx

+0

あなたのブラウザの '/ user/edit'に行くと、フォームに記入すると、提出時に上記のエラーが表示されますか? – eiko

答えて

0

あなたのルートはPATCHですが、フォームはGETエンドポイントに当たっています。これにあなたのビュー内の最初の行を変更してみてください:

<%= form_for(@user, :url => { :action => "update_password" }, :method => patch) do |f| %> 
0

あなたはそれはあなたがそうでなければ行うための本当に良い理由をしていない限り、彼らが実装されてきたものを使用することが一般的にはるかに簡単だ工夫使用している場合。あなたのconfig/routes.rbをファイルに必要なのは次のとおりです。

devise_for :users 

あなたの端末からすくいルートを実行する、ことをやった、あなたは、あなたのアカウントを削除、登録、パスワードを変更するためのルートのリストが表示されます後あなたは本当に怠け者になりたい場合など。もしあなたの端末から実行することができます。

rails g devise:install views 

これはあなたがユーザーを管理するために必要なすべてのフォームやビューを提供します。次にビューに人をリンクさせるためには、あなたのために設定されたルートを使用するだけです。実行

リンクする必要があるルートが表示されます。たとえば、サインインボタンを作成するには、link_to new_user_session_pathを入力します。サインアップボタンの場合は、link_to new_user_registration_pathになります。そのページには、パスワードのリセットやアカウントの削除などの簡単なリンクがあります。

0

deviseのようなルートを使用することができます。

resource :user, only: [:edit] do 
    collection do 
     patch 'update_password' 
    end 
    end 

用途:それはRailsのルートcheck out this documentation

関連する問題