我是Rails 5的新手,正在从事一个项目,其中每个类别都有一个页面,并且只显示具有特定或相同类别的博客项目。
例如:博客标题1至博客标题5具有类别";Tech";博客标题6至博客标题8具有类别";商务";。
如果我点击http://localhost:3000/blogs/tech它将显示博客标题1到5,如果我点击http://localhost:3000/blogs/business它将显示博客标题6到8。
为了做到这一点,我尝试在我的博客控制器上创建自定义范围:
class BlogsController < ApplicationController
def index
@blogs = Blog.all
end
def business
@blogs = Blog.business
end
end
然后在我的博客模型上:
class Blog < ApplicationRecord
def self.business
where(post_category: 1)
end
end
我还为我的业务方法创建了一个新的视图,以显示所有业务类型类别的博客项目,并在我的index.html.erb文件上复制了相同的内容:
<p id="notice"><%= notice %></p>
<h1>Post Category 0</h1>
<table>
<thead>
<tr>
<th>Title</th>
<th>Body</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @blogs.each do |blog| %>
<tr>
<td><%= blog.title %></td>
<td><%= blog.body %></td>
<td><%= link_to blog.status, toggle_status_blog_path(blog) %></td>
<td><%= blog.post_category.title %></td>
<td><%= link_to 'Show', blog %></td>
<td><%= link_to 'Edit', edit_blog_path(blog) %></td>
<td><%= link_to 'Destroy', blog, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Blog', new_blog_path %>
最后我更新了我的路线:
get 'blogs/business', to: 'blogs#business'
而这将适用于单个项目。如果每次我创建一个新的类别时,我都不知道应用程序的用户会在类别标题上添加什么,那么手动放置它是行不通的。我如何通过编程实现这一点,使它在每次创建新类别时都会创建新页面,而不是每次手动添加并创建视图?
有什么方法可以做到这些吗?
旁注:Blog和PostCategory表通过post_category_id相互关联。
您不必在此处使用作用域。只需使用BlogsController#show
来显示来自给定类别的帖子。
首先为PostCategory
(在数据库中)添加一个slug
字段。现在您在URL中使用title
,但必须将其更改为转义值(没有空格、特殊字符等)
你可能可以用gem来完成,或者你可以使用我要点中的代码。只需记住根据您的模型和字段进行调整即可。
然后,添加一条路由(routes.rb
):
get 'blog/:slug', to: 'blogs#show', as: :blog_category
最后,在您的BlogsController
中,添加show
方法:
def show
category = PostCategory.find_by(slug: params[:slug])
@blogs = Blog.where(post_category: category.id)
end
仅此而已。当然,您可以通过允许params、添加joins
和执行一个获取博客的查询来修改show
,但这可以稍后完成。