質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1344閲覧

link_to の遷移先が上手くいかない

haru_ren

総合スコア48

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/09/04 10:49

編集2020/09/10 21:12

現在、railsにてdeviseを用いてinstagram風のアプリを作成しているのですが、
パスワード変更ページに遷移するリンクを押すとなぜか、サインインページにリダイレクトされてしまいます。

何卒、よろしくお願いいたします。

解決したい課題
・ユーザー編集ページに設置したパスワード変更ページに遷移するリンクをクリックした際に、パスワード変更ページに遷移させたい。

rails routes

new_user_password GET /users/password/new(.:format) users/passwords#new edit_user_password GET /users/password/edit(.:format) users/passwords#edit user_password PATCH /users/password(.:format) users/passwords#update PUT /users/password(.:format) users/passwords#update POST /users/password(.:format) users/passwords#create cancel_user_registration GET /users/cancel(.:format) users/registrations#cancel new_user_registration GET /users/sign_up(.:format) users/registrations#new edit_user_registration GET /users/edit(.:format) users/registrations#edit

app/views/devise/registrations/edit.htmo.erb

<% provide(:title, @user.username) %> <h1>Update your profile</h1> <div class="row"> <div class="col-md-6 col-md-offset-3"> <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> <%= devise_error_messages! %> <%= f.label :fullname %><br /> <%= f.text_field :fullname, autofocus: true, class: 'form-control' %> <%= f.label :username %><br /> <%= f.text_field :username, autofocus: true, class: 'form-control' %> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, class: 'form-control' %> <%= f.submit "Update", class: "btn btn-primary" %> <% end %> <%= link_to "Password change", edit_user_password_path(@user) %> <div class="gravatar_edit"> <%= gravatar_for @user %> <a href="https://gravatar.com/emails" target="_blank">change</a> </div> </div> </div>

app/views/devise/passwords/edit.htmo.erb

<h2>Change your password</h2> <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <%= f.hidden_field :reset_password_token %> <div class="field"> <%= f.label :password, "New password" %><br /> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %> characters minimum)</em><br /> <% end %> <%= f.password_field :password, autofocus: true, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :password_confirmation, "Confirm new password" %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "Change my password" %> </div> <% end %> <%= render "devise/shared/links" %>

config/routes.rb

Rails.application.routes.draw do root 'pages#top' devise_for :users, controllers: { registrations: 'users/registrations', omniauth_callbacks: 'users/omniauth_callbacks', passwords: 'users/passwords'} resources :users do member do get :following, :followers end end resources :users, only: [:show, :index, :destroy] resources :microposts, only: [:create, :destroy] resources :relationships, only: [:create, :destroy] get '/notification', to:'pages#notification' get '/post', to:'pages#post' end

app/controllers/users/passwords_controller.rb

class Users::PasswordsController < Devise::PasswordsController def edit binding.pry super binding.pry redirect_to edit_user_password_path(@user) #redirect_to edit_user_password_path binding.pry end def update super end end

app/controllers/users_controller.rb

class UsersController < ApplicationController before_action :authenticate_user!, only: [:show, :destroy, :index, :following, :followers] before_action :set_user, only: [:show] before_action :admin_user, only: [:destroy] before_action :current_user, only: [:index] def index @users = User.paginate(page: params[:page]) end def show @user = current_user #binding.pry @microposts = @user.microposts.paginate(page: params[:page]) end def destroy User.find(params[:id]).destroy flash[:success] = "User deleted" redirect_to users_url end #def update #binding.pry #if @user.update(user_params) #redirect_to user_path(current_user) #else #redirect_to edit_user_registration_path(current_user) #end #end private def set_user @user = User.find(params[:id]) end def user_params params.fetch(:user, {}).permit(:username) end # 管理者かどうか確認 def admin_user redirect_to(root_url) unless current_user.admin? end # 正しいユーザーかどうか確認 def correct_user @user = User.find(params[:id]) redirect_to(root_url) unless current_user?(@user) end end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Method: Devise::PasswordsController#edit
より、GET /resource/password/edit?reset_password_token=abcdef
パスワードを変更するにはreset_password_tokenが必要になります。

devise/passwords_controller.rb
より、該当するコントローラーのコードを見てみると

class Devise::PasswordsController < DeviseController prepend_before_action :require_no_authentication # Render the #edit only if coming from a reset password email link append_before_action :assert_reset_token_passed, only: :edit # GET /resource/password/edit?reset_password_token=abcdef def edit self.resource = resource_class.new set_minimum_password_length resource.reset_password_token = params[:reset_password_token] end protected # Check if a reset_password_token is provided in the request def assert_reset_token_passed if params[:reset_password_token].blank? set_flash_message(:alert, :no_token) redirect_to new_session_path(resource_name) end end end

if params[:reset_password_token].blank? set_flash_message(:alert, :no_token) redirect_to new_session_path(resource_name) end

params[:reset_password_token].blank?の時は
redirect_to new_session_path(resource_name)に飛ぶようになっています。
つまり、reset_password_tokenを入れないと、新規登録画面にリダイレクトされています。

これでリダイレクトの謎が解けました。
あとはGET /resource/password/edit?reset_password_token=abcdefのようなリンクにするためにreset_password_tokenを生成する方法を調べてみてください。

deviseは機能豊富すぎて難しいですよね、頑張ってください!

投稿2020/09/12 06:30

necocoa

総合スコア209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haru_ren

2020/09/12 09:29

ご回答ありがとうございます! リダイレクトされる原因が理解できました。 reset_password_tokenを生成する方法を調べて実装していきます!
guest

0

get 'users/password/edit', to:'devise/passwords#edit'
で生成されたルーティングが下記なので

Prefix Verb URI Pattern Controller#Action users_password_edit GET /users/password/edit(.:format) devise/passwords#edit

users_password_edit_path(@user)ではないでしょうか?

投稿2020/09/10 12:52

nasuk47

総合スコア311

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haru_ren

2020/09/10 20:50

ご回答ありがとうございます! users_password_edit_path(@user) で試してみたところ、下記のようなエラーメッセージが出ました。 Unknown action Could not find devise mapping for path "/users/password/edit.1". This may happen for two reasons: 1) You forgot to wrap your route inside the scope block. For example: devise_scope :user do get "/some/route" => "some_devise_controller" end 2) You are testing a Devise controller bypassing the router. If so, you can explicitly tell Devise which mapping to use: @request.env["devise.mapping"] = Devise.mappings[:user] また、rails routes で二重定義されていたため、routes.rbを整理し、投稿内容を更新しました。
nasuk47

2020/09/10 21:59

edit_user_password_path のみだとどうでしょうか? 引数に何も渡さない記述です。
haru_ren

2020/09/12 05:47

ご回答ありがとうございます! edit_user_password_pathのみで実行したところ、ユーザーページ(show)ページにリダイレクトされました。下記がログになります。 Started GET "/users/password/edit" for ::1 at 2020-09-12 14:40:01 +0900 Processing by Users::PasswordsController#edit as HTML User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] Redirected to http://localhost:3000/users/1 Filter chain halted as :require_no_authentication rendered or redirected Completed 302 Found in 7ms (ActiveRecord: 0.7ms | Allocations: 1859) Started GET "/users/1" for ::1 at 2020-09-12 14:40:01 +0900 Processing by UsersController#show as HTML Parameters: {"id"=>"1"}
nasuk47

2020/09/12 06:40

パスはきちんと飛んでいますが Filter chain halted as :require_no_authentication rendered or redirected のエラーが出ていますね。 ログインはできていますか?
haru_ren

2020/09/12 16:38

ログインできています!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問