繁体   English   中英

Rails.application.routes.recognize_path,设计经过验证的路由

[英]Rails.application.routes.recognize_path with devise authenticated route

我有一个设计启用路线:

#config/routes.rb
authenticated :user {
  root :to => 'home#signed_in'
}
root :to => 'home#index

和控制器:

#app/controllers/home_controller.rb
class HomeController < ApplicationController
  def signed_in
    Rails.application.routes.recognize_path '/'
  end
end

提出:

NoMethodError: undefined method `authenticate?' for nil:NilClass
...lib/devise/rails/routes.rb:286:in `block in authenticated'

我需要根据request.referer控制器名称在destroy动作中呈现不同的模板。 如何为此类URL获取“经过身份验证的”控制器/操作名称?

  authenticated :user do
    root :to => 'home#signed_in'
  end

  unauthenticated :user do
    root :to => 'home#index'
  end

你可以使用这个: https//gist.github.com/NullVoxPopuli/8c8af217b7404336c72a

class RouteRecognizer
  include Singleton

  ROUTE_LIST = Rails.application.routes.routes.collect{|r| r.path.spec.to_s}
  REGEX_ROUT_LIST = ROUTE_LIST.map{|r|
    Regexp.new(r.gsub(/\:(.*)id/, "(\d+)").gsub("(.:format)", ""))
  }

  def self.is_route?(path)
    REGEX_ROUT_LIST.each do |regex|
      return true if !!(path =~ regex)
    end
    false
 end
end

然后打电话给

RouteRecognizer.is_route?('http://whatever')

似乎使用Rails.application.routes.recognize_path不适用于自定义路由约束,如设计#authenticated方法。

请参阅https://github.com/plataformatec/devise/issues/3747

recogn_path不会像需要请求相关对象的约束那样工作(比如Devise期望在请求env Hash中的warden实例)。 如果您在控制器代码中执行此操作,则可以将warden对象从request.env传递给recogn_path调用,或者尝试将对象向下传递给识别路径的类。

另一方面,由于recogn_path不是一个记录的公共API,我强烈建议您不要使用它并在应用程序中保存params Hash而不是原始URL。

您的问题的一个解决方案可能是在会话中保存控制器/操作名称并在需要时访问它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM