没有路线匹配{:action =>" show_post_category",:category_id => 5,:controller =>" posts"}

时间:2017-11-21 14:53:38

标签: ruby-on-rails ruby

在练习Rails时,我遇到了一个问题,我无法解决它,如下所示: - 当我点击类别名称时,我想显示属于该类别的所有帖子(通过外键category_id),我在' post'控制器:

def show_post_category
  if params[:category_id]
    @categories = Category.find_by(params[:category_id])
    @posts = @categories.posts
  else
    @posts= Post.all
  end
end

在视图中,我编写代码以显示类别名称超链接:

<% @categories = Category.all %>
<% @categories.each do |c| %>                      
  <li>
    <%= link_to c.name, :controller => "posts", :action => "show_post_category", :category_id => c.id %>
  </li>     
<% end %>

但是,当我点击类别名称时,会显示错误

'No route matches {:action=>"show_post_category", :category_id=>5,:controller=>"posts"}.

以下是路线文件中的代码:

Rails.application.routes.draw do
  resources :posts
  resources :categories   
  resources :categories do
    posts do
      get 'show_post_category'
    end
  end 
end

我的代码中的问题在哪里?请给我解决方案。

非常感谢你,

3 个答案:

答案 0 :(得分:0)

def show_post_category
    if params[:id].present?
        @posts = Category.find(params[:id]).posts
    else
        @posts= Post.all
    end
end

甚至更短

def show_post_category
    @posts = params[:id].present? ? Category.find(params[:id]).posts : Post.all
end

更改路线:get 'show_post_category/:id'

each替换为map

<% @categories = Category.all %>
<% @categories.map do |c| %>                      
    <li>
        <%= link_to c.name, :controller => "posts", :action => "show_post_category", :id => c.id %>
    </li>     
<% end %>

答案 1 :(得分:0)

这肯定听起来令人沮丧!

也许您应该尝试指定这是let rec add_half l = match l with | [ ] -> [ ] | x::xs -> let x' = float_of_int x in (x' +. 0.5) :: add_half xs 文件中的集合,如下所示:

routes.rb

让我知道这对你有用。

如果您想进行更深入的研究,请参阅更多有用的文档:http://guides.rubyonrails.org/routing.html

答案 2 :(得分:0)

你可以做得更好。

要创建显示属于某个类别的所有帖子的路线,您需要以下路线:

GET /categories/:category_id/posts

这是宣布nested resource的一种安静方式。

您可以通过以下方式声明路线:

resources :posts do
  resources :categories, only: :index, module: :posts
end

module: :posts告诉Rails我们要使用单独的Categories::PostsController#index代替PostsController

class Categories::PostsController < ApplicationController
  before_action :set_category

  # GET /categories/:category_id/posts
  def index
    @posts = @category.posts
  end

  private

  def set_category
    @category = Category.includes(:posts).find(params[:category_id])
  end 
end

在这里使用模块是非常可选的,但它的恕我直言是#34; param嗅探的优秀解决方案&#34;:

class PostsController < ApplicationController
  # GET /posts
  # and
  # GET /categories/:category_id/posts
  def index
    if params[:category_id]
       @posts = Category.includes(:posts).find(params[:category_id])
    else
       @posts = Post.all
    end
  end
end

后者违反了单一责任原则。