【问题标题】:Overwrite generated restful url helpers in Rails在 Rails 中覆盖生成的 restful url 助手
【发布时间】:2011-07-01 20:56:57
【问题描述】:

假设我有一个 Page 资源,并且一个特定实例的 id = 5 和 permalink = foobar。

使用resources :pages,我可以使用<%= link_to @page.title, @page %>,它会输出网址“/pages/5”。

如何让它输出“/pages/foobar”?编辑 url 也是如此......我如何让edit_page_path(@page) 输出“/pages/foobar/edit”?

更新

到目前为止,答案是覆盖 Page.rb 中的to_param,这是一个很好的开始。每个+1。但是如果我想让<%=link_to @page.title, @page%> 输出“/:permalink”而不是“/pages/:permalink”呢?我会接受随之而来的答案。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 helpers


    【解决方案1】:

    您可以覆盖模型中的 to_param 方法,该方法将告诉 Rails 使用什么来代替路由的主键。

    例如

    class Page
      def to_param
        "#{self.id}-#{self.title.parameterize}"
      end
    end
    

    参数化调用使您的标题 URL 友好,您可能还会注意到 self.id 的使用,如果您有重复的标题,建议这样做。

    【讨论】:

    • 啊酷。但是...如果我想将页面路径设为“/:permalink”而不是“/pages/:permalink”怎么办??
    • 您必须在 config/routes.rb 文件中创建自定义路由。如match /:permalink' => pages#show(我的头顶)
    • 您可以使用:as => :foo 标志,例如match /:permalink' => "pages#show", :as => :pages。但是,我不确定这是否会覆盖 resourcespages_path 的使用。我假设如果你把这个match 调用放在resources 调用上面,它会正常工作。
    【解决方案2】:

    您需要覆盖模型中的 to_param 方法以返回所需的字段。 Here's a blog post with some examples:

    【讨论】:

      【解决方案3】:

      您想使用永久链接。

      将此添加到您的模型中:

      class Post 
      
          def to_param
              "#{id}-{title}"
          end
      
      end 
      

      这假设您有一个标题。

      一旦你得到这个,你想查找permalink-fu,或者通过保存后自己做实际上非常简单:

      类帖

      before_save :manage_peramlink
      
      def manage_peramlink
          permalink = "#{name.gsub(/\s/, '_').gsub(/[^\w-]/, '').downcase}"
      end
      
      def to_param
          "permalink"
      end
      

      结束

      确保将 peramlink 作为字段添加到模型中。

      【讨论】:

        猜你喜欢
        • 2015-08-27
        • 2014-07-02
        • 2014-12-07
        • 1970-01-01
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 2014-04-18
        • 2017-07-11
        相关资源
        最近更新 更多