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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1448閲覧

カテゴリ一覧表から1つのカテゴリを選択し、そのカテゴリの投稿一覧を表示する方法

mayuphoo

総合スコア13

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/03/07 11:13

Ruby on railsで、簡単なレシピの投稿アプリを作成しています。

現在、カテゴリ一覧表から該当のカテゴリを選択すると、そのカテゴリのみの投稿一覧ページに遷移する、という実装をしています。
このカテゴリ一覧は、どのページにいてもクリックできるように、常時表示されているヘッダー内に置いてあります。

しかし、トップページであるrootパス以外のページからカテゴリ選択をすると、Routing Errorが出てしまい、選択したジャンルの一覧ページが表示されません。

おそらく、各カテゴリに設定しているlink_toメソッドのパスに、直接パスをしていることが原因だと思うのですが、他にどのような書き方をすれば良いのか見つけることができず、困っています。

どなたかご教授いただけると、幸いです。
宜しくお願いいたします。

※カテゴリは、テーブルを使用せずActiveHashを用いて作成しています。
※articles_controller(投稿記事に関するコントローラ)に、genreアクション(カテゴリー専用アクション)を設定して、実装しています。
※もし載せ足りないファイルなどがありましたら教えていただけると幸いです。

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

Routing Error No route matches [GET] "/articles/articles/genre/2"

route.rb

Rails.application.routes.draw do devise_for :users get '/articles/genre/:id', to: "articles#genre" resources :mypages, only: :show resources :articles do resource :like, only: [:create, :destroy] end root "articles#index" end

articles_controller.rb

class ArticlesController < ApplicationController before_action :find_article, only: [:show, :edit, :update, :destroy] def index @articles = Article.order(created_at: :desc).search(params[:search]) end def show @like = Like.new end def new @article = Article.new end def create @article = Article.new(article_params) if @article.save redirect_to @article, notice: '投稿が完了しました' else render :new, alert: '投稿できませんでした' end end def edit end def update if @article.update(article_params) redirect_to @article, notice: '更新できました' else render :new, alert: '更新できませんでした' end end def destroy if @article.destroy redirect_to @article, notice: '削除が完了しました' else redirect_to root_path, alert: '削除できませんでした' end end def genre @article = Article.find_by(genre_id: params[:id]) @articles = Article.where(genre_id: params[:id]).order('created_at DESC') end private def find_article @article = Article.find(params[:id]) end def article_params params.require(:article).permit(:title, :body, :genre_id, images: []).merge(user_id: current_user.id) end end

genre.rb(カテゴリ用のActiveHash)

class Genre < ActiveHash::Base self.data = [ { id: 1, name: '--' }, { id: 2, name: 'お肉のおかず' }, { id: 3, name: '魚介のおかず' }, { id: 4, name: '野菜のおかず' }, { id: 5, name: 'ご飯もの' }, { id: 6, name: '卵料理' }, { id: 7, name: 'パスタ・グラタン' }, { id: 8, name: '麺類' }, { id: 9, name: '副菜・サラダ' }, { id: 10, name: 'スープ・汁物・シチュー' }, { id: 11, name: 'お菓子・スイーツ' } ] include ActiveHash::Associations has_many :articles end

###_header.html.erb(全てのページに共用しているヘッダー部分)

<nav class="navbar navbar-default"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navgation"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <div class="navbar-logo"> <a class="navbar-brand" href="/">Cooking Blog</a> </div> <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"> <div class="search-icon"> <%= form_tag(articles_path, :method => "get") do %> <%= text_field_tag :search, '',placeholder: 'キーワードで探す' %> <%= submit_tag "Search" ,:title => nil ,class: "button is-info"%> <% end %> </div> <div class="category-icon"> <div class="category" id="lists">カテゴリで探す</div> </div> </div> <div class="collapse navbar-collapse" id="navigation"> <p class="navbar-text navbar-right"> <%# <% if user_signed_in? && current_user.id == 1 %> <%= link_to '新規作成', new_article_path %> <%# <% end %> <% if user_signed_in? %> <%= link_to "ログアウト", destroy_user_session_path, method: :delete %> <%= link_to current_user.nickname, mypage_path(current_user.id) %> <% else %> <%= link_to "ログイン", new_user_session_path %> &nbsp; <%= link_to "ユーザー登録", new_user_registration_path %> <% end %> </p> </div> <ul class="show-lists hid" id="pull-down"> <li class="pull-down-list" id="pull-lists"><%= link_to 'お肉のおかず', 'articles/genre/2' %></li> <li class="pull-down-list" id="pull-lists"><%= link_to '魚介のおかず', 'articles/genre/3' %></li> <li class="pull-down-list" id="pull-lists"><%= link_to '野菜のおかず', 'articles/genre/4' %></li> <li class="pull-down-list" id="pull-lists"><%= link_to 'ご飯もの', 'articles/genre/5' %></li> <li class="pull-down-list" id="pull-lists"><%= link_to '卵料理', 'articles/genre/6' %></li> <li class="pull-down-list" id="pull-lists"><%= link_to 'パスタ・グラタン', 'articles/genre/7' %></li> <li class="pull-down-list" id="pull-lists"><%= link_to '麺類', 'articles/genre/8' %></li> <li class="pull-down-list" id="pull-lists"><%= link_to '副菜・サラダ', 'articles/genre/9' %></li> <li class="pull-down-list" id="pull-lists"><%= link_to 'スープ・汁物・シチュー', 'articles/genre/10' %></li> <li class="pull-down-list" id="pull-lists"><%= link_to 'お菓子・スイーツ', 'articles/genre/11' %></li> </ul> </div> </nav>

###genre.heml.erb(選択したジャンルの投稿一覧)

<div class="container"> <div class="row"> <h1><%= @article.genre.name %></h1> <% @articles.each do |article| %> <%= link_to article do %> <div class="col-md-3 margin-top-5per article-block"> <div class="article-genre"> <%= article.genre.name %> </div> <%= image_tag article.images[0], class: 'img-responsive padding-top-15'%> <div class="padding-bottom-15"> <p class="title"><%= article.title %></p> <% end %> <div class="bottom-article"> <div class="like"> <% if current_user.already_liked?(article) %> <%= button_to article_like_path(article.id), class:"index-button", method: :delete, data: {confirm: "削除しますか?"} do %> <div class= "like-group"> <p class="heart-icon"> <i class="fas fa-heart"></i> </p> <p class="count-number"> <%= article.likes.count %> </p> </div> <% end %> <% else %> <%= button_to article_like_path(article.id),class:"index-button" do %> <div class= "like-group"> <p class="heart-icon"> <i class="far fa-heart"></i> </p> <p class="count-number"> <%= article.likes.count %> </p> </div> <% end %> <% end %> </div> <div class="date"> <%= article.created_at.strftime('%Y/%m/%d') %> </div> </div> </div> </div> <% end %> </div> <div class="row"> <button type="button" class="btn btn-outline-primary"> <%= link_to "ホームへ戻る", root_path %> </button> </div> </div>

index.html.erb(rootパス。ここから選択したカテゴリの一覧ページに遷移することはできる。)

<div class="container"> <div class="row"> <% @articles.each do |article| %> <div class="col-md-4 margin-top-5per article-block"> <div class="article-genre"> <%= article.genre.name %> </div> <%= link_to article do %> <div class="articles"> <%= image_tag article.images[0].variant(resize: '400x400'), class:'img-responsive padding-top-15' %> </div> <div class="padding-bottom-15"> <p class="title"><%= article.title %></p> </div> <% end %> <div class="padding-bottom-15"> <%= article.user.nickname %> さんの投稿 </div> <div class="bottom-article"> <%# いいね %> <div class="like"> <% if user_signed_in? %> <% if current_user.already_liked?(article) %> <%= button_to article_like_path(article.id), class:"index-button", method: :delete do %> <div class= "like-group"> <p class="heart-icon"> <i class="fas fa-heart"></i> </p> <p class="count-number"> <%= article.likes.count %> </p> </div> <% end %> <% else %> <%= button_to article_like_path(article.id),class:"index-button" do %> <div class= "like-group"> <p class="heart-icon"> <i class="far fa-heart"></i> </p> <p class="count-number"> <%= article.likes.count %> </p> </div> <% end %> <% end %> <% else %> <span class="gray-heart"><i class="fas fa-heart"></i></span> <% end %> </div> <%# いいね %> <div class="date"> <%= article.created_at.strftime('%Y/%m/%d') %> </div> </div> </div> <% end %> </div> </div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

'articles/genre/2 この書き方は相対PATHといって、いま表示しているURLからのpathになります。 つまり今どこを表示しているか、によって違うURLになってしまいます。
'/articles/genre/2 と絶対パスにするか
article_genre_path(2) とhelper使うかしてください。
article_genre_path でよいかどうか、、は rails routes で確認。

投稿2021/03/07 23:07

winterboum

総合スコア23329

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

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

mayuphoo

2021/03/09 07:49

絶対パスにして見たら、できました( ; ; ) ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問