显示某个类别的所有帖子

Display all posts from a certain category

我希望在页面上显示来自特定类别的所有 post,我目前有帖子和类别模型 link 由 HABTM 关系编辑。我希望能够单击我的 index.html.erb 上的 link 并进入一个页面,该页面列出了属于该特定类别的所有 post。

我需要为类别和新路线创建控制器吗?

Post.rb

class Post < ActiveRecord::Base
  has_and_belongs_to_many :categories
  belongs_to :user
end

Category.rb

class Category < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

Index.html.erb(我目前显示每个类别的方式post)

<% post.categories.each do |category| %>
  <% category.posts.each do |post| %>
    <%= link_to category.name, post_url(post) %>
  <% end %>
<% end %>

** 更新 **

如下所示生成答案路线后。

          category_posts GET    /categories/:category_id/posts(.:format)          posts#index
                     POST   /categories/:category_id/posts(.:format)          posts#create
   new_category_post GET    /categories/:category_id/posts/new(.:format)      posts#new
  edit_category_post GET    /categories/:category_id/posts/:id/edit(.:format) posts#edit
       category_post GET    /categories/:category_id/posts/:id(.:format)      posts#show
                     PATCH  /categories/:category_id/posts/:id(.:format)      posts#update
                     PUT    /categories/:category_id/posts/:id(.:format)      posts#update
                     DELETE /categories/:category_id/posts/:id(.:format)      posts#destroy
          categories GET    /categories(.:format)                             categories#index
                     POST   /categories(.:format)                             categories#create
        new_category GET    /categories/new(.:format)                         categories#new
       edit_category GET    /categories/:id/edit(.:format)                    categories#edit
            category GET    /categories/:id(.:format)                         categories#show
                     PATCH  /categories/:id(.:format)                         categories#update
                     PUT    /categories/:id(.:format)                         categories#update
                     DELETE /categories/:id(.:format)                         categories#destroy

您可以在类别中嵌套帖子

resources :categories do
  resources :posts
end

这将使像 categories/1/posts 这样的路由和像 category_posts_path(1) 这样的 URL 助手,其中 1 是类别 ID。然后在你的帖子控制器中,你将有 params[:category_id] 可用,它可以查找类别然后获取帖子。像

if params[:category_id]
  @category = Category.find params[:category_id]
  @posts = @category.posts
else
  @posts = Post.all
end 

必须回答:

在您的类别模型中:

def to_param
  name
end

但请接受 Logan 的答案作为正确答案,因为他解决了您原来的问题。

def index 
 if params[:category_id]
  @posts = Post.where("category_id = ?", params[:category_id])
 else
   @posts = Post.all
 end 
end

Logan's Answer 的替代方案,因为在某些情况下它可能不起作用。