如何在 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_id
和link
创建表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 friendly_id 不会在 heroku 上的现有用户上呈现