我在Cloud9上开发了我的Rails应用程序。
我想要做的是为URL设置标题的一部分,例如stackoverflow。
(例如example.com/part-of-tile-here
)
虽然我发现了类似的问题,但我不明白我应该做什么,因为其中一些是旧帖子,答案中找不到链接。 (例如Adding title to rails route)
我现在还不会使用Gem。
如果你能给我任何暗示,我将不胜感激。
答案 0 :(得分:2)
一般来说,何文是对的,但建议的解决方案有一些注意事项。
首先,您应该覆盖# app/models/page.rb
def to_param
slug
end
# ... which allows you to do this in views/controllers:
page_path(@page)
# instead of
page_path(@page.slug)
方法,因此它实际上使用了slug:
find_by!(slug: params[:id])
其次,您应该使用find_by_xxx
来1)最新(find
是deprecated in Rails 4.0 and removed from Rails 4.1)和2)复制ActiveRecord::RecordNotFound
的行为并提出{ {1}}如果找不到给定slug的帖子,则会出现错误。
第三,我建议始终保持最新的slu and并包含ID如下:
# app/models/page.rb
before_validation :set_slug
def to_param
"#{id}-#{slug}"
end
private
def set_slug
self.slug = title.parameterize
end
# ... which allows you to use the regular ActiveRecord find again because it just looks at the ID in this case:
@post = Post.find(params[:id]) # even if params[:id] is something like 1-an-example-post
如果您关心搜索引擎结果,那么您还应该在<head>
部分中包含规范网址和/或在控制器中以301状态重定向,以避免搜索引擎通常不会重复的内容。喜欢:
# in the view
<%= tag(:link, rel: :canonical, href: page_url(@page)) %>
# and/or in the controller:
redirect_to(post_url(@post), status: 301) and return unless params[:id] == @post.to_param
希望有所帮助。
答案 1 :(得分:0)
看看这个Railscast大致是你想要的。
tl; dr
您希望保存slug
,这是一个参数化标题,在您保存页面时由-
分隔。 (在before_validation
或before_save
)
例如,&#34;随机标题页&#34;将会生成random-title-of-page
作为它的slug。
before_validation :generate_slug
def generate_slug
self.slug ||= title.parameterize
end
在页面控制器中,您需要按slug
启用搜索。
def show
@page = Page.find_by_slug(params[:id])
end