显示某个类别的所有帖子
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 的替代方案,因为在某些情况下它可能不起作用。
我希望在页面上显示来自特定类别的所有 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 的替代方案,因为在某些情况下它可能不起作用。