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

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

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

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

Q&A

1回答

3784閲覧

他人の情報を編集できないようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/02/27 18:20

編集2020/02/28 07:01

ログインしている本人のみ自分の情報を編集できるように設定したいのですが、Rspecでエラーが発生します。
他人の編集画面に移ろうとしたときはuser/idに遷移させたいです。
こちらのエラー文をもとに修正したいのですが、方法が分からないためアドバイス頂けると嬉しいです。
よろしくお願い致します。

ターミナル 3) ユーザーのテスト 編集のテスト 他人の編集画面への遷移 遷移できない Failure/Error: expect(current_path).to eq('/users/' + user.id.to_s) expected: "/users/2" got: "/users/1" (compared using ==)
usersコントローラ class UsersController < ApplicationController before_action :authenticate_user! before_action :correct_user, only: [:edit, :update] def index @book = Book.new @users = User.page(params[:page]).reverse_order end def show @user = User.find(params[:id]) @book = Book.new @books = @user.books.page(params[:page]).reverse_order end def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) if @user.update(user_params) flash[:notice] = "successfully." redirect_to user_path(@user.id) else render :edit end end private def user_params params.require(:user).permit(:name, :introduction, :profile_image) end def correct_user @user = User.find(params[:id]) redirect_to(user_url) unless @user == current_user end end
rake routes   ~省略~ edit_user_registration GET /users/edit(.:format) users/registrations#edit user_registration PATCH /users(.:format) users/registrations#update PUT /users(.:format) users/registrations#update DELETE /users(.:format) users/registrations#destroy POST /users(.:format) users/registrations#create root GET / top#top home_about GET /home/about(.:format) top#home users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy books GET /books(.:format) books#index POST /books(.:format) books#create new_book GET /books/new(.:format) books#new edit_book GET /books/:id/edit(.:format) books#edit book GET /books/:id(.:format) books#show PATCH /books/:id(.:format) books#update PUT /books/:id(.:format) books#update DELETE /books/:id(.:format) books#destroy

【追記】

system/users_spec.rb describe '編集のテスト' do context '自分の編集画面への遷移' do it '遷移できる' do visit edit_user_path(user) expect(current_path).to eq('/users/' + user.id.to_s + '/edit') end end context '他人の編集画面への遷移' do it '遷移できない' do visit edit_user_path(test_user2) expect(current_path).to eq('/users/' + user.id.to_s) end end context '表示の確認' do before do visit edit_user_path(user) end it 'User infoと表示される' do expect(page).to have_content('User info') end it '名前編集フォームに自分の名前が表示される' do expect(page).to have_field 'user[name]', with: user.name end it '画像編集フォームが表示される' do expect(page).to have_field 'user[profile_image]' end it '自己紹介編集フォームに自分の自己紹介が表示される' do expect(page).to have_field 'user[introduction]', with: user.introduction end it '編集に成功する' do click_button 'Update User' expect(page).to have_content 'successfully' expect(current_path).to eq('/users/' + user.id.to_s) end it '編集に失敗する' do fill_in 'user[name]', with: '' click_button 'Update User' expect(page).to have_content 'error' #もう少し詳細にエラー文出したい expect(current_path).to eq('/users/' + user.id.to_s) end end end

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

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

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

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

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

guest

回答1

0

redirect_to(user_url) unless @user == current_user

redirect_to(user_url(current_user)) unless @user == current_user
にしてみてください
なお
@user = User.find(params[:id])をなくして unless @user == current_userunless params[:id] == current_user.id にしたほうがDBへのアクセスを抑制できます

追加
そのテストでFailするのは

def edit @user = User.find(params[:id]) end

となっているのが原因ですね。

def edit if params[:id] == current_user.id @user = User.find(params[:id]) render action: :edit else @user = current_user render action: :show end end

でしょうか

投稿2020/02/28 00:05

編集2020/02/28 08:11
winterboum

総合スコア23331

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

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

退会済みユーザー

退会済みユーザー

2020/02/28 01:37 編集

ありがとうございます。 def correct_user redirect_to(user_url(current_user)) unless params[:id] == current_user.id end としてみましたが同じエラーになり、ユーザー編集画面のRspec全てに引っかかってしまいました。
winterboum

2020/02/28 01:42 編集

エラーというのは Rspec でfailになるという意味ですか?本当のエラーですか? Error: の場合はもっとメッセージが出ると思います。それを載せてください あと、テストのcodeも
退会済みユーザー

退会済みユーザー

2020/02/28 01:43

Rspecの方でfailになります。 実際の挙動は、別のエラーが発生しているため現在見ることができません。
winterboum

2020/02/28 01:44

testのcodeを載せてください
退会済みユーザー

退会済みユーザー

2020/02/28 02:10

申し訳ございません。 見間違えており遷移できるようになっておりました。 編集のテスト 自分の編集画面への遷移 遷移できる (FAILED - 3) 他人の編集画面への遷移 遷移できない (今解決) 表示の確認 User infoと表示される 名前編集フォームに自分の名前が表示される (FAILED - 4) 画像編集フォームが表示される (FAILED - 5) 自己紹介編集フォームに自分の自己紹介が表示される (FAILED - 6) 編集に成功する (FAILED - 7) 編集に失敗する (FAILED - 8) 3) ユーザーのテスト 編集のテスト 自分の編集画面への遷移 遷移できる Failure/Error: expect(current_path).to eq('/users/' + user.id.to_s + '/edit') expected: "/users/2/edit" got: "/users/2" (compared using ==) 現在はこのようになっております。
winterboum

2020/02/28 02:17

それらのFailureについて質問をつづけるなら、codeを載せてください
退会済みユーザー

退会済みユーザー

2020/02/28 02:41

お願いします。 FAILED - 3を解決すれば他のテスト項目も解決できるかもしれないので、上記のものを参照して頂けますでしょうか? 他に必要なコードがあれば教えてください。
winterboum

2020/02/28 03:55

データの準備から全部揃っていないと判断できません。 全体を載せたくないのでしたら、再現できるサイズに縮めたのを載せてください。
退会済みユーザー

退会済みユーザー

2020/02/28 04:58

必要そうなコードを追記させて頂きました。 ご確認お願い致します。
winterboum

2020/02/28 06:27

どれ? テストコードを載せてくれと何度も言ってるんですが
退会済みユーザー

退会済みユーザー

2020/02/28 06:50 編集

本当にすみません。 DBなどのコードと勘違いしていました。 テストコードを記述します。 質問本文の【追記】以下をご覧ください。
winterboum

2020/02/28 06:54

それは実行結果です。 欲しいのはプログラム
退会済みユーザー

退会済みユーザー

2020/02/28 07:02

追記しなおしましたが、合っているでしょうか? コードが長いため該当部分のみ記述しました。
退会済みユーザー

退会済みユーザー

2020/02/28 12:07

追加で回答ありがとうございます。 そのように直してみましたが、同様のエラーとなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問