在Rails5中自动管理类别的多个自定义作用域



我是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,但这可以稍后完成。

最新更新