ruby-on-rails - 在 Rails 5 中自动管理多个类别的自定义范围
问题描述
我是 Rails 5 的新手,正在从事一个项目,其中每个类别都有一个页面,并且只会显示具有特定或相同类别的博客项目。
例如:博客标题 1 到博客标题 5 具有类别“技术”,博客标题 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'
虽然这适用于单个项目。如果每次我创建一个新类别时,手动放置它是行不通的,而且我不确切知道应用程序的用户将在类别标题上添加什么。如何以编程方式执行此操作,以便每次创建新类别时都会创建新页面,而不是每次手动添加并创建视图?
有没有办法做到这些?
旁注:博客和 PostCategory 表通过 post_category_id 相互关联。
解决方案
您不必在此处使用范围。仅用于BlogsController#show
显示给定类别的帖子。
首先为(在数据库中)添加一个slug
字段。PostCategory
现在您title
在 URL 中使用,但必须将其更改为转义值(不含空格、特殊字符等)。
您可能可以使用 gem 来完成,或者您可以使用我的 gist中的代码。请记住将其调整为您的模型和字段。
然后,添加一个路由 ( routes.rb
):
get 'blog/:slug', to: 'blogs#show', as: :blog_category
最后,在您的BlogsController
, addshow
方法中:
def show
category = PostCategory.find_by(slug: params[:slug])
@blogs = Blog.where(post_category: category.id)
end
就这样。当然,您可以show
通过允许参数进行修改,添加joins
并执行单个查询以获取博客,但这可以稍后完成。
推荐阅读
- android - 解码facebook graphql body?
- reactjs - 在多个测试中共享 jest 模拟模块的单个实现
- video - html5 video / video.js :设备之间的比特率是否一致?
- swift - 需要帮助理解这两个语句是如何相等的
- swiftui - 如何在 SwiftUI 中为前导对齐文本视图指定 x 和/或前导填充?
- angular - 无法将 .ts 中的数据渲染到 mat-table 或 Angular 2 中的一般 html 文件
- docker - 在 docker 终端中,如何删除传入的 jupyter 日志?
- spring-boot - 如何根据 Swagger 的自定义 Annotation 创建注释/描述
- angular - 当文件完全上传时,在得到最终的UploadProgress的响应之后还是在得到HttpHeaderResponse/HttpResponse之后?
- snowflake-cloud-data-platform - 将 Netezza 表 DDL 转换为 Snowflake 版本