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

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

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

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

Ruby

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

532閲覧

resource ルーティングのネストで、不要なアクションを作らない方法はありますか?

chasu

総合スコア21

Router

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

Ruby

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2022/09/03 12:15

現在、railsで通知機能を実装していて、Routingの実装方法が分かりません。具体的には、notificationリソースにdestroy_allアクションをcollectionとして追加したいのですが、書き方が分かりません。次のように書いており、index以外の不要なnotificationリソースのアクションが生成されています。

resources :notifications, only: :index resources :notifications do collection do delete 'destroy_all' end end

また、ルーティングが原因なのか不明ですが、destroy_all メソッドを実行すると、図1のようなshowアクションを探索するエラーが発生します。コントローラーは図2のようにindexアクションへのリダイレクトを期待します。何故showアクションが探索されるのでしょうか。図3は該当するviewです。

Unknown action The action 'show' could not be found for NotificationsController
class NotificationsController < ApplicationController before_action :sign_in_required, only: :index def index #current_userの投稿に紐づいた通知一覧 @notifications = current_user.passive_notifications #@notificationの中でまだ確認していない(indexに一度も遷移していない)通知のみ @notifications.where(checked: false).each do |notification| notification.update(checked: true) end end def destroy_all #通知を全削除 @notifications = current_user.passive_notifications.destroy_all redirect_to notifications_path end end

view

1 2<div class="grid grid-cols-1 justify-center bg-lime-100 px-3 py-3"> 3 <div class='bg-lime-200'> 4 <% if @notifications.exists? %> 5 <%= link_to destroy_all_notifications_path, method: :delete do %> 6 <p>全て削除</p> 7 <% end %> 8 <%= render @notifications %> 9 <% else %> 10 <div class="flex w-full flex-col justify-center items-center mb-48"> 11 <span class ="relative"> 12 <div class="h-36 w-36 bg-white rounded-full -ml-1.5 "></div> 13 <%= image_tag 'ojigi_animal_inu.png', class:' absolute top-6 left-4 z-10 w-24 h-28 p-4' %> 14 </span> 15 <p class="font-medium py-2">新着の通知はありません。</p> 16 </div> 17 <% end %> 18 </div> 19</div> 20

情報の不備などございましたらご指摘ください。よろしくお願いします。

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

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

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

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

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

winterboum

2022/09/03 13:52

delete を使っていないなら、only に delete を追加して、そこで destroy_all すれば良いように思うのだが。routes を不必要に複雑にしてる。 Show を探してしまうのは http method が GET になってるから。 method で :delete になってますが 素のブラウザーは対応してくれない。 Rails 7ではどうやるのかわからんので、回答できない。。。。
guest

回答1

0

ベストアンサー

resources doにもonly:を付けられます。

ruby

1# resources doは単なるresources+中身を処理する、ということになるので、 2# 2行書く必要はない 3resources :notifications, only: :index do

投稿2022/09/03 13:09

maisumakun

総合スコア145184

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

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

chasu

2022/09/03 13:41

ご回答ありがとうございます。 わかりました。では、エラーの原因についてもお考えをうかがえますでしょうか?
maisumakun

2022/09/03 13:47

method: :deleteには適用する条件がいくつかあります。 ・Railsのバージョンはいくつですか? ・rails-ujsは適用していますか?
chasu

2022/09/03 14:23

返信遅くなりまして申し訳ありません。 Rails 7.0.3.1 rails-ujsは使用しておりません。
maisumakun

2022/09/03 14:36

Rails 7ではmethod: :deleteは適用できません。「turbo」について調べてみてください。
chasu

2022/09/03 14:46

現在, Hotwire をフル活用してポートフォリオアプリを作っています。 button_to で代用したところうまくいきました。 ご丁寧に対応していただきありがとうございました。
chasu

2022/09/03 20:43

また、ルーティングは最終的に次のように修正いたしました。 resources :notifications, only: :index scope :notifications do delete '/destroy_all', to: 'notifications#destroy_all', as: 'destroy_all_notifications' end
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問