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

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

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

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

Q&A

解決済

2回答

2591閲覧

deviseでのRouteでeditやdestroyに引数がない理由

ohs6261

総合スコア7

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/24 11:53

Railsでdeviseを使うと、次のようなRouteが作成されると思います。
通常のresourcesだとeditやdestroyには、@userなどの引数が必要だと思うのですが、なぜdeviseで作成されたRoutesには引数がないのでしょうか。
どのように渡すデータを特定するのでしょうか。

Rails

1 devise_for :users

Rails

1new_user_session GET /users/sign_in(.:format) devise/sessions#new 2 user_session POST /users/sign_in(.:format) devise/sessions#create 3 destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy 4 user_password POST /users/password(.:format) devise/passwords#create 5 new_user_password GET /users/password/new(.:format) devise/passwords#new 6 edit_user_password GET /users/password/edit(.:format) devise/passwords#edit 7 PATCH /users/password(.:format) devise/passwords#update 8 PUT /users/password(.:format) devise/passwords#update 9cancel_user_registration GET /users/cancel(.:format) devise_invitable/registrations#cancel 10 user_registration POST /users(.:format) devise_invitable/registrations#create 11 new_user_registration GET /users/sign_up(.:format) devise_invitable/registrations#new 12 edit_user_registration GET /users/edit(.:format) devise_invitable/registrations#edit 13 PATCH /users(.:format) devise_invitable/registrations#update 14 PUT /users(.:format) devise_invitable/registrations#update 15 DELETE /users(.:format) devise_invitable/registrations#destroy

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

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

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

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

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

guest

回答2

0

ベストアンサー

例をとってdestroyで説明します。
Deviseのdestroyは以下のようになっています。

rb

1class Devise::RegistrationsController < DeviseController 2 prepend_before_action :authenticate_scope!, only: [:edit, :update, :destroy] 3 4 def destroy 5 resource.destroy 6 Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name) 7 set_flash_message! :notice, :destroyed 8 yield resource if block_given? 9 respond_with_navigational(resource){ redirect_to after_sign_out_path_for(resource_name) } 10 end 11 12 def authenticate_scope! 13 send(:"authenticate_#{resource_name}!", force: true) 14 self.resource = send(:"current_#{resource_name}") 15 end

質問の本旨としてresourceはどうやって取得しているのかになるかと思います。

rb

1def authenticate_scope! 2 send(:"authenticate_#{resource_name}!", force: true) 3 self.resource = send(:"current_#{resource_name}") 4end

ここでresourceを取得しています。sendメソッドについてわからなければググってください。
resource_nameはDeviseで管理しているリソースの名前です。
今回はdevise_for :usersとしているのでresource_name == 'user'となります。

Deviseはログインしているリソースをcurrent_#{resource_name}というメソッドで管理しています。
今回であればcurrent_userです。

なので、destroyはいかなる場合でも ログインしているリソース == 自分自身のアカウント しか削除しない設計になっているため、URLにリソースを特定するような情報は不要と言うわけです。

投稿2020/05/26 10:06

Mugheart

総合スコア2349

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

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

ohs6261

2020/05/27 09:40

非常にわかりやすいです!!納得できました! ありがとうございます!!
guest

0

Deviseが定義しているrouteをよく見てください。
ユーザー特定が必要なものはみな current_user で事足りるでしょう

投稿2020/05/24 14:08

winterboum

総合スコア23567

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

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

ohs6261

2020/05/26 09:15

すいません、もう少し詳しく教えていただいてもよろしいでしょうか?知識が足りず理解できなくて...
winterboum

2020/05/26 09:43

どこがわからないのかな?
ohs6261

2020/05/27 09:45

winterboumさんの回答も納得できました! 簡潔で明快ですね。理解力不足でした!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問