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

时间:2011-07-14 17:18:00

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

现在我有类似的东西

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来设置自定义友好网址

我该怎么办?

6 个答案:

答案 0 :(得分:3)

FriendlyID是一个伟大的宝石。

实现用户定义的页面URL应该不难。 使用pagesuser_id

创建表格link
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属性添加输入。

或者,您可以在标题或其他内容上设置friendly_id:use_slug =&gt;真正的选择。这样,FriendlyID将获取标题并对其进行修改,使其不具有和限制字符。它将使用它自己的表来存储slu ..使用cached_slug来增加性能。

更新

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

  1. link字段中设置friendly_id而不使用slugs ..
  2. 创建一个虚拟属性permalink,以便您可以在表单中显示它。
  3. 在before_filter中,检查permalink是否已设置。
  4. 如果是,请将其写入link字段。
  5. 如果不是,请将标题写入link字段。
  6. 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
    

答案 1 :(得分:2)

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

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

希望这是你要找的东西:)

答案 2 :(得分:0)

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

我有一个名为Node的模型id和友好的网址字段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进行正确的工作,也可能需要这样做。 如果我在这些假设中错了,请随意纠正我。

答案 3 :(得分:0)

如果你看this screencast,,它会向你解释。它已经过时了,但它非常相关。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

1)使用Stringex

2)sluggable-finder

3)friendly_id

可以找到完整的分步方法,其中包含每种方法的使用原因here。快乐阅读!

相关问题