Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3.1 Rack中间件如何重定向到my Rails应用程序中的视图_Ruby On Rails 3.1_Rack - Fatal编程技术网

Ruby on rails 3.1 Rack中间件如何重定向到my Rails应用程序中的视图

Ruby on rails 3.1 Rack中间件如何重定向到my Rails应用程序中的视图,ruby-on-rails-3.1,rack,Ruby On Rails 3.1,Rack,在我的Rails 3.1应用程序中,我创建了一个机架中间件来验证访问。如果访问未经批准,用户将被重定向到页面。具体来说,这将是一个页面,我已经在我的意见。假设我试图重定向到dummy.html.erb,我在routes.rb中定义为 match '/dummy', to :'page#dummy' 佩奇是我的控制器 我尝试了以下方法,但似乎遇到了一些重定向循环 我的机架中间件位于/lib中: class AccessVerifier def initialize(app) @app

在我的Rails 3.1应用程序中,我创建了一个机架中间件来验证访问。如果访问未经批准,用户将被重定向到页面。具体来说,这将是一个页面,我已经在我的意见。假设我试图重定向到dummy.html.erb,我在routes.rb中定义为

match '/dummy', to :'page#dummy'
佩奇是我的控制器

我尝试了以下方法,但似乎遇到了一些重定向循环

我的机架中间件位于/lib中:

class AccessVerifier
  def initialize(app)
    @app = app
  end
  def call (env)
    #....
    #....do some type of verification here and redirect if fail verification
    #....
    [301, {"Location" => '/dummy', "Content-Type" => "text/html"}, []]
  end
end
在application.rb中,我有

config.autoload_paths += %W(#{config.root}/lib)
config.middleware.use "AccessVerifier"
我还尝试在我的中间件中调用一个控制器,但我再次陷入重定向循环。我从我的中间件类调用了控制器,如下所示:

  def call (env)
    ...
    status,headers,response=PageController.action("validateAccess").call(env)
  end
在我的控制器中:

 class PageController < ApplicationController
   def validateAccess
     redirect_to :controller => 'page', :action => "dummy"
   end
   ...
 end
class PageController“page”,:action=>“dummy”
结束
...
结束

我见过在不使用机架中间件的情况下成功完成重定向,例如仅使用控制器,但请注意,在应用程序运行之前,我需要在中间件中完成此操作。

我没有现成的答案来直接回答您的问题。然而,我建议使用cancan gem来处理授权,而不是创建一个自主开发的解决方案。看

答案很简单,我觉得很傻。问题是,当我重定向到某处时,比如说/dummy,这会导致再次通过机架中间件,并再次通过我的AccessVerifier代码,这会重定向到/dummy,并一次又一次地这样做,从而导致重定向循环。为了修复它,我通过检查传入路径是否包含在我的停止点列表中(其中/dummy位于该列表中)来强制停止点,然后停止。下面是一个伪代码示例

if path in ListOfAcceptableStoppingPoints
    @app.call(env)
这解决了重定向循环的问题,但现在我怀疑我的具体案例是否最好不使用rake中间件,因为我发现现在我正在过滤其他东西,比如资产。当然,我可以试着通过,挑选出我认为需要允许通过的所有东西,但这似乎太乏味,也不正确。似乎最终,我需要在rails级别而不是机架级别进行过滤