【问题标题】:Accessing URL helpers in routes.rb在 routes.rb 中访问 URL 助手
【发布时间】:2012-03-22 12:04:36
【问题描述】:

我想使用以下行重定向路径中的路径:

get 'privacy_policy', :controller => :pages, :as => 'privacy_policy'
get 'privacypolicy.php' => redirect(privacy_policy_url)

这样 /privacypolicy.php 就会被重定向到它上面定义的正确页面。

但是,它会抛出以下错误:

undefined local variable or method `privacy_policy_url'

所以我猜不能在 routes.rb 中使用 URL 助手。有没有办法在路由文件中使用 URL 帮助程序,是否建议这样做?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我知道我来晚了,但这个问题是谷歌搜索“在 routes.rb 中使用 url_helpers”时最热门的问题之一,我最初是在偶然发现这个问题时发现的,所以我会喜欢分享我的解决方案。

    正如@martinjlowm 在他的回答中提到的那样,在绘制 新路线时不能使用 URL 助手。但是,一种使用 URL 帮助程序定义重定向路由规则的方法。问题是,ActionDispatch::Routing::Redirection#redirect 可以接受一个块(或#call-able),这是稍后(当用户点击路线时)使用两个参数调用的,paramsrequest,返回一个新的路由,一个字符串。并且由于此时路由已正确绘制,因此在块内调用 URL 助手是完全有效的!

    get 'privacypolicy.php', to: redirect { |_params, _request|
      Rails.application.routes.url_helpers.privacy_policy_path
    }
    

    此外,我们可以使用 Ruby 元编程工具来添加一些糖:

    class UrlHelpersRedirector
      def self.method_missing(method, *args, **kwargs) # rubocop:disable Style/MethodMissing
        new(method, args, kwargs)
      end
    
      def initialize(url_helper, args, kwargs)
        @url_helper = url_helper
        @args = args
        @kwargs = kwargs
      end
    
      def call(_params, _request)
        url_helpers.public_send(@url_helper, *@args, **@kwargs)
      end
    
      private
    
      def url_helpers
        Rails.application.routes.url_helpers
      end
    end
    
    # ...
    
    Rails.application.routes.draw do
      get 'privacypolicy.php', to: redirect(UrlHelperRedirector.privacy_policy_path)    
    end
    

    【讨论】:

      【解决方案2】:

      URL 助手是从路由创建的。因此,它们在绘制新路线时将无法使用。

      您将不得不使用 gayavat 的方法。

      -- 或--

      使用 http://guides.rubyonrails.org/routing.html 那样的确切 URL 进行重定向。

      编辑:

      如果它不仅仅是一个 '...php' 路由,您可能需要考虑制作一个重定向控制器。看看这里,怎么设置:http://palexander.posterous.com/provide-valid-301-redirects-using-rails-route

      在你的路由文件中,你应该在底部添加这个,这样它就不会干扰其他路由:

      get '/:url' => 'redirect#index'
      

      【讨论】:

      • 这是有道理的。我已经看到了确切的 URL 方法,但如果我决定移动页面,我不想重写路径两次。然而,这是迄今为止最好的解决方案,如果帮助程序失败(我不想为每页创建一个新变量来包含路径)。
      • 这是有道理的。但恐怕没有更简单的方法可以做到这一点。如果它不仅仅是您要重定向的一个“...php”路线,您可以查看我添加到答案中的链接。
      【解决方案3】:

      类似:

      get 'privacypolicy.php' => "privacy_policy#show"
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多