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 %> <%= 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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/09 07:49