【问题标题】:How to user defined friendly URLs in Rails 3?如何在 Rails 3 中用户定义友好的 URL?
【发布时间】: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

我应该怎么做?

【问题讨论】:

标签: ruby-on-rails-3 friendly-url friendly-id


【解决方案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 提高性能。

    更新

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

    1. link 字段上设置friendly_id 没有slugs..
    2. 创建一个虚拟属性permalink,以便您可以在表单中显示它。
    3. 在before_filter中,检查permalink是否被设置。
    4. 如果是,请将其写入link 字段。
    5. 如果不是,请将标题写入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 找到完整的分步方法以及每种方法的使用原因。祝阅读愉快!

          【讨论】:

            猜你喜欢
            • 2011-05-08
            • 2015-06-11
            • 2011-06-27
            • 1970-01-01
            • 2010-12-27
            • 2015-12-30
            • 2011-01-06
            • 1970-01-01
            相关资源
            最近更新 更多