【问题标题】:Rails 3 - Customizing resourceful routesRails 3 - 自定义资源丰富的路线
【发布时间】:2011-07-10 12:39:20
【问题描述】:

我为博客设置了资源丰富的路由(模型名称:文章)。

我想自定义我的资源路由来指向

articles/show/title-of-my-article

现在我通读了:

http://edgeguides.rubyonrails.org/routing.html#customizing-resourceful-routes

但它似乎并没有解释如何覆盖参数,而不仅仅是 :controller 或 :action。问题是我可以做一个单一的资源或匹配一个 GET 请求,但我想覆盖我的资源丰富的路线,所以我仍然可以使用所有资源助手(即 article_path(@article.title) )等。

任何人都可以在这里帮助我,非常感谢任何和所有的帮助!

【问题讨论】:

    标签: ruby-on-rails ruby routes


    【解决方案1】:

    您应该覆盖模型上的 to_param 方法:

    class Article
      def to_param
        self.title
      end
    end
    

    如果你想变得更棘手,你应该阅读generating custom slugs

    【讨论】:

      【解决方案2】:

      除了乔尼的回答。

      当你调用像article_path(@article) 这样的资源助手时,覆盖to_param 方法会产生标题,它会作为params[:id] 传递给控制器​​。

      此后,您将需要或多或少手动查找文章,即,而不是这样做

      Article.find(params[:id])
      

      你需要这样做

      Article.find_by_title(params[:id])
      

      如果没有找到记录,我不记得是否会创建 NotFound 异常,因为 find 方法会这样做,在这种情况下,您必须手动检查是否找到记录并自己引发异常如果不是为了触发404页面。

      这样做的一个问题是标题可能包含 URL 中不允许或不推荐的字符,因此更好的方法是根据标题在数据库中存储一个 slug 并通过它找到它。

      (您可以通过在模型中使用过滤器自动创建 slug,并通过title.parameterize 创建它)

      最简单的方法当然是使用已经处理这些事情的众多 gem 和插件之一。

      【讨论】:

      • 是的,我知道我必须去掉标题中所有不好的部分以使其对 URL 友好。我将自己编写或使用 gem 来操作 before_save 过滤器中的标题,并将操作后的字符串保存在数据库中的 URL 字段中。然后覆盖 jonnii 提供的 to_param 方法。非常感谢你们!
      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多