Rails:如何将页面标题设置为URL(路由)

时间:2017-07-18 07:13:24

标签: ruby-on-rails ruby

我在Cloud9上开发了我的Rails应用程序。

我想要做的是为URL设置标题的一部分,例如stackoverflow。

(例如example.com/part-of-tile-here

虽然我发现了类似的问题,但我不明白我应该做什么,因为其中一些是旧帖子,答案中找不到链接。 (例如Adding title to rails route

我现在还不会使用Gem。

如果你能给我任何暗示,我将不胜感激。

2 个答案:

答案 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)最新(finddeprecated 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_validationbefore_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