如何在 Rails 3 中用户定义友好的 URL?

Posted

技术标签:

【中文标题】如何在 Rails 3 中用户定义友好的 URL?【英文标题】:How to user defined friendly URLs in Rails 3? 【发布时间】:2011-10-05 13:20:21 【问题描述】:

现在我有这样的东西

http://myapp.com/pages/1
http://myapp.com/pages/2
http://myapp.com/pages/3
http://myapp.com/pages/4

每一页都属于一个user

我需要为每个用户设置自己的页面自定义名称。

我正在考虑使用 friendly_id gem http://norman.github.com/friendly_id/ 但我没有找到任何方法可以直接编辑 slug 以设置自定义友好 url

我应该怎么做?

【问题讨论】:

请看这个其他帖子:[***.com/questions/4995759/…希望有帮助,[1]:***.com/questions/4995759/… 【参考方案1】:

向其中一个模型添加 to_param 方法应该会有所帮助:

def to_param
  "#id-#call_to_method_that_returns_custom_name.parameterize"
end

希望这就是你要找的:)

【讨论】:

【参考方案2】:

FriendlyID 是一个很棒的宝石。

实现用户定义的页面 URL 应该不难。 使用user_idlink 创建表pages

class User < ActiveRecord::Base
  has_many :pages

class Page < ActiveRecord::Base
  belongs_to :user

  has_friendly_id :link # link is name of the column whose value will be replaced by slugged value

page#new 上添加link 属性的输入。

或者,您可以使用 :use_slug => true 选项在 title 或其他内容上设置 friendly_id。这样,FriendlyID 将获取标题并对其进行修改,使其没有和受限制的字符。它将使用它自己的表来存储蛞蝓。使用cached_slug 提高性能。

更新

要让用户选择是否要设置自定义链接,您可以这样做:

    link 字段上设置friendly_id 没有slugs.. 创建一个虚拟属性permalink,以便您可以在表单中显示它。 在before_filter中,检查permalink是否被设置。 如果是,请将其写入link 字段。 如果不是,请将标题写入link 字段。

FriendlyID 使用 babosa gem 来生成 slug。如果您也决定使用它,您的过滤器可能如下所示:

protected
  def generate_link
                #you might need to use .nil? instead
    self.link = self.permalink.empty? ? make_slug(self.title) : make_slug(self.permalink)
  end

  def make_slug(value)
    value.to_slug.normalize.to_s #you could as well use ph6py's way
  end

【讨论】:

但是,如果我想将它保存在一个字段中,我有该页面的 title 字段......我可以使用 has_friendly_id :title 然后我可以使用friendly_id 基于标题,但我想提供第二个选项...类似custom_link 所以当用户在那里设置一些值时,如果用户想要自定义的东西,它首先需要custom_link 而不是friendly_id URL 中的页面标题这是一个好方法吗?你怎么看?【参考方案3】:

我没有使用friendly_url gem,不确定我的方法是否有效。但对我来说效果很好。

我有一个名为 Node 的模型,带有 id 和友好的 url 字段,名为 url_title

我的routes.rb 文件:

resource 'nodes/:url_title', :to => 'Nodes#view'

nodes_controller.rb

class NodesController <ActiveController
 def view
  @node = Node.find_by_url_title(:params(url_title))
 end
end

并使用@node 变量填充您的视图。

现在,每当我输入 www.example.com/nodes/awesome-title 时,它​​都会将我带到正确的页面。反对这一点的一个论点可能是需要在非主字段上创建索引。但我认为即使在friendly_url gem 中也可能需要更好的性能。此外,非主字段url_title 需要是唯一的。同样,即使为 friendly_url 正确工作也可能需要这样做。 如果我在这些假设中有错误,请随时纠正我。

【讨论】:

【参考方案4】:

如果您观看this screencast,,它会向您解释。它很旧,但非常相关。

【讨论】:

【参考方案5】:

我为此使用friendly_id 4.x 写了一篇文章。它将首先根据定义的属性创建一个 slug,然后允许用户使用表单对其进行更新。在这里查看:http://fedible.org/posts/customizing-friendly_id-slugs。

【讨论】:

【参考方案6】:

有多种方法,你可以实现这个-

1) 使用 Stringex

2) sluggable-finder

3)friendly_id

可以在here 找到完整的分步方法以及每种方法的使用原因。祝阅读愉快!

【讨论】:

以上是关于如何在 Rails 3 中用户定义友好的 URL?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 6 - 将 URL 中 root_path 的参数更改为 SEO 友好的 URL

Rails 4中友好id gem的随机slug url

Rails friendly_id 不会在 heroku 上的现有用户上呈现

如何在 ASP.NET 中将 base64 图像 URL 转换为用户友好 URL

如何创建用户友好的 url,如 ***?

如何在 Rails 模块中定义辅助方法?