【问题标题】:Make URL be title of post使 URL 成为帖子的标题
【发布时间】:2012-08-02 04:29:42
【问题描述】:

目前我的网址显示为www.website.com/entries/1,我想让它们显示为www.website.com/title-of-entry。我一直在搞乱routes 并且已经能够让entry 标题显示在URL 中,但是Rails 在不提供ID 的情况下无法找到entry。如果我将 ID 与参数一起发送,则 URL 将显示为 www.website.com/title-of-entry?=1。无论如何我可以传递ID而不让它作为参数出现在URL中吗?谢谢!

【问题讨论】:

    标签: ruby-on-rails-3 url routes format


    【解决方案1】:

    像大多数事情一样,这有一个宝石。

    FriendlyID.

    安装简单,几分钟内即可启动并运行。试一试。

    【讨论】:

      【解决方案2】:

      通常您会希望将此部分保存在数据库title-of-entry 中(调用字段slug 或其他名称)。您的模型可能如下所示:

      class Entry < ActiveRecord::Base
      
        before_validation :set_slug
      
        def set_slug
          self.slug = self.title.parameterize
        end
      
        def to_param
          self.slug
        end
      
      end
      

      现在您生成的路线如下所示:/entries/title-of-entry

      要找到相应的条目,您必须更改控制器:

      # instad of this
      @entry = Entry.find(params[:id]
      
      # use this
      @entry = Entry.find_by_slug(params[:id])
      

      更新

      需要注意的几点:

      1. 您必须确保 slug 是唯一的,否则 Entry.find_by_slug(params[:id]) 将始终返回它遇到的第一个条目。

      2. Entry.find_by_slug(params[:id]) 不会引发ActiveRecord::RecordNotFound 异常,而是只返回nil。考虑使用Entry.find_by_slug!(params[:id])

      3. 如果你真的希望你的路线看起来像这样/title-of-entry,你以后可能会遇到问题。如果 entry slug 看起来与另一个控制器的名称相同,路由器可能会得到意想不到的结果。

      【讨论】:

      • 非常感谢@Wukerplank 的详细建议,我昨晚搞砸了,无法让事情正常进行。无论我通过哪个id,我总是会被定向到同一个entry。我相信如果有更多的时间和黑客攻击,我可以按照你的建议让事情顺利进行,但为了方便起见处理 slug/title 问题,我将使用 gem。不过,您绝对值得为此投票,再次感谢!
      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      相关资源
      最近更新 更多