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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

1256閲覧

フレンドリーフォワーディングの実装

bluesolar

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/17 03:05

フレンドリーフォワーディングの実装について

現在railsでポートフォリオを作成中なのですが、次のようなエラーが発生してしまいます。
おそらくフレンドリーフォワーディングが実装できていないのが原因だと思うのですが、いろいろ調べても必要なファイルやコードなどは揃っているように感じます。
何か解決策がありましたらご教示お願いします。

発生している問題・エラーメッセージ

Failures: 1) プロフィール編集 認可されたユーザーの場合 レスポンスが正常に表示されること(+フレンドリーフォワーディング) Failure/Error: expect(response).to redirect_to edit_user_url(user) Expected response to be a redirect to <http://www.example.com/users/17183/edit> but was a redirect to <http://www.example.com/users/17183>. Expected "http://www.example.com/users/17183/edit" to be === "http://www.example.com/users/17183". # ./spec/requests/users_edit_spec.rb:11:in `block (3 levels) in <top (required)>' # -e:1:in `<main>' 2) プロフィール編集 ログインしていないユーザーの場合 ログイン画面にリダイレクトすること Failure/Error: expect(response).to redirect_to login_path Expected response to be a redirect to <http://www.example.com/login> but was a redirect to <http://www.example.com/>. Expected "http://www.example.com/login" to be === "http://www.example.com/". # ./spec/requests/users_edit_spec.rb:26:in `block (3 levels) in <top (required)>' # -e:1:in `<main>'

該当のソースコード

Ruby

1[users_edit_spec.rb] 2require "rails_helper" 3 4RSpec.describe "プロフィール編集", type: :request do 5 let!(:user) { create(:user) } 6 let!(:other_user) { create(:user) } 7 8 context "認可されたユーザーの場合" do 9 it "レスポンスが正常に表示されること(+フレンドリーフォワーディング)" do 10 get edit_user_path(user) 11 login_for_request(user) 12 expect(response).to redirect_to edit_user_url(user) 13 patch user_path(user), params: { user: { name: "Example User", 14 email: "user@example.com", 15 introduction: "初めまして", 16 sex: "男性" } } 17 follow_redirect! 18 expect(response).to render_template('users/show') 19 end 20 end 21 22 context "ログインしていないユーザーの場合" do 23 it "ログイン画面にリダイレクトすること" do 24 # 編集 25 get edit_user_path(user) 26 expect(response).to have_http_status "302" 27 expect(response).to redirect_to login_path 28 # 更新 29 patch user_path(user), params: { user: { name: user.name, 30 email: user.email } } 31 expect(response).to have_http_status "302" 32 expect(response).to redirect_to login_path 33 end 34 end 35 36 context "別アカウントのユーザーの場合" do 37 it "ホーム画面にリダイレクトすること" do 38 # 編集 39 login_for_request(other_user) 40 get edit_user_path(user) 41 expect(response).to have_http_status "302" 42 expect(response).to redirect_to root_path 43 # 更新 44 patch user_path(user), params: { user: { name: user.name, 45 email: user.email } } 46 expect(response).to have_http_status "302" 47 expect(response).to redirect_to root_path 48 end 49 end 50end 51

Ruby

1[users_controller.rb] 2class UsersController < ApplicationController 3 before_action :correct_user, only: [:edit, :update] 4 before_action :logged_in_user, only: [ 5 :index, :show, :edit, :update, :destroy, :following, :followers, 6 ] 7 8 def new 9 @user = User.new 10 end 11 12 def show 13 @user = User.find(params[:id]) 14 @cafes = @user.cafes.paginate(page: params[:page], per_page: 5) 15 end 16 17 def index 18 @users = User.paginate(page: params[:page]) 19 end 20 21 def create 22 @user = User.new(user_params) 23 if @user.save 24 log_in @user 25 flash[:success] = "カフェアプリへようこそ!" 26 redirect_to @user 27 else 28 render 'new' 29 end 30 end 31 32 def edit 33 @user = User.find(params[:id]) 34 end 35 36 def update 37 @user = User.find(params[:id]) 38 if @user.update_attributes(user_params_update) 39 flash[:success] = "プロフィールが更新されました!" 40 redirect_to @user 41 else 42 render 'edit' 43 end 44 end 45 46 def destroy 47 @user = User.find(params[:id]) 48 # 管理者ユーザーの場合 49 if current_user.admin? 50 @user.destroy 51 flash[:success] = "ユーザーの削除に成功しました" 52 redirect_to users_url 53 # 管理者ユーザーではないが、自分のアカウントの場合 54 elsif current_user?(@user) 55 @user.destroy 56 flash[:success] = "自分のアカウントを削除しました" 57 redirect_to root_url 58 else 59 flash[:danger] = "他人のアカウントは削除できません" 60 redirect_to root_url 61 end 62 end 63 64 def following 65 @title = "フォロー中" 66 @user = User.find(params[:id]) 67 @users = @user.following.paginate(page: params[:page]) 68 render 'show_follow' 69 end 70 71 def followers 72 @title = "フォロワー" 73 @user = User.find(params[:id]) 74 @users = @user.followers.paginate(page: params[:page]) 75 render 'show_follow' 76 end 77 78 private 79 80 # ユーザー新規作成時に許可する属性 81 def user_params 82 params.require(:user).permit(:name, :email, :password, 83 :password_confirmation) 84 end 85 86 # プロフィール編集時に許可する属性 87 def user_params_update 88 params.require(:user).permit(:name, :email, :introduction, :sex) 89 end 90 91 # ログイン済みユーザーかどうか確認 92 def logged_in_user 93 unless logged_in? 94 store_location 95 flash[:danger] = "ログインしてください" 96 redirect_to login_url 97 end 98 end 99 100 # 正しいユーザーかどうか確認 101 def correct_user 102 @user = User.find(params[:id]) 103 if !current_user?(@user) 104 flash[:danger] = "このページへはアクセスできません" 105 redirect_to(root_url) 106 end 107 end 108end

Ruby

1[sessions_helper.rb] 2module SessionsHelper 3 def log_in(user) 4 session[:user_id] = user.id 5 end 6 7 # ユーザーのセッションを永続的にする 8 def remember(user) 9 user.remember 10 cookies.permanent.signed[:user_id] = user.id 11 cookies.permanent[:remember_token] = user.remember_token 12 end 13 14 # 渡されたユーザーがログイン済みユーザーであればtrueを返す 15 def current_user?(user) 16 user == current_user 17 end 18 19 # 記憶トークンcookieに対応するユーザーを返す 20 def current_user 21 if (user_id = session[:user_id]) 22 @current_user ||= User.find_by(id: user_id) 23 elsif (user_id = cookies.signed[:user_id]) 24 user = User.find_by(id: user_id) 25 if user && user.authenticated?(cookies[:remember_token]) 26 log_in user 27 @current_user = user 28 end 29 end 30 end 31 32 def logged_in? 33 !current_user.nil? 34 end 35 36 # 永続的セッションを破棄する 37 def forget(user) 38 user.forget 39 cookies.delete(:user_id) 40 cookies.delete(:remember_token) 41 end 42 43 def log_out 44 forget(current_user) 45 session.delete(:user_id) 46 @current_user = nil 47 end 48 49 # 記憶したURL (もしくはデフォルト値) にリダイレクト 50 def redirect_back_or(default) 51 redirect_to(session[:forwarding_url] || default) 52 session.delete(:forwarding_url) 53 end 54 55 # アクセスしようとしたURLを覚えておく 56 def store_location 57 session[:forwarding_url] = request.original_url if request.get? 58 end 59end

Ruby

1[sessions_controller.rb] 2class SessionsController < ApplicationController 3 def new 4 end 5 6 def create 7 user = User.find_by(email: params[:session][:email].downcase) 8 if user && user.authenticate(params[:session][:password]) 9 log_in user 10 params[:session][:remember_me] == '1' ? remember(user) : forget(user) 11 redirect_back_or user 12 else 13 flash.now[:danger] = 'メールアドレスとパスワードの組み合わせが誤っています' 14 render 'new' 15 end 16 end 17 18 def destroy 19 log_out if logged_in? 20 redirect_to root_url 21 end 22end

Ruby

1[application_controller.rb] 2class ApplicationController < ActionController::Base 3 before_action :set_search 4 protect_from_forgery with: :exception 5 include SessionsHelper 6 7 # フィードから検索条件に該当する投稿を検索 8 def set_search 9 if logged_in? 10 @search_word = params[:q][:name_or_ingredients_name_cont] if params[:q] 11 @q = current_user.feed.paginate(page: params[:page], per_page: 5).ransack(params[:q]) 12 @cafes = @q.result(distinct: true) 13 end 14 end 15 16 private 17 18 # ログイン済みユーザーかどうか確認 19 def logged_in_user 20 unless logged_in? 21 store_location 22 flash[:danger] = "ログインしてください" 23 redirect_to login_url 24 end 25 end 26end

試したこと

ネットでフレンドリーフォワーディングの実装に必要なことを色々調べ、確認しました。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました!

結論から言うと、users_controller.rbにある「before_action」の順番が逆でした。
「logged_action_user」でログインしてないユーザーだったらログインページ(/login)に飛ぶところを、「correct_user」が先に来てしまっていたためログインページに飛ぶ前にrootページ(/)に飛んでしまっていました。

投稿2020/11/18 08:22

bluesolar

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問