3

我有一个启用设计的路线:

#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控制器名称在销毁操作中呈现不同的模板。如何获取此类 URL 的“经过身份验证的”控制器/操作名称?

4

3 回答 3

1

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

https://github.com/plataformatec/devise/issues/3747

对于需要请求相关对象的约束(例如 Devise 期望在请求 env Hash 中的warden 实例),recognize_path 将无法正常工作。如果您在控制器代码中执行此操作,您可能能够将守望者对象从 request.env 传递给识别路径调用,或者尝试将对象向下传递到识别路径的类。

另一方面,由于识别路径不是记录在案的公共 API,我强烈建议您不要使用它并在应用程序中保存参数哈希而不是原始 URL。

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

于 2016-07-18T04:53:12.530 回答
0
  authenticated :user do
    root :to => 'home#signed_in'
  end

  unauthenticated :user do
    root :to => 'home#index'
  end
于 2013-03-17T17:24:00.283 回答
0

你可以使用这个: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')
于 2014-12-28T20:06:05.283 回答