ruby-on-rails-3.1 - Rack 中间件如何重定向到我的 Rails 应用程序中的

在我的 Rails 3.1 应用程序中,我创建了一个 Rack 中间件来验证访问。如果访问未获批准,则用户将被重定向到一个页面。具体来说,它将是我已经拥有的页面。假设我正在尝试重定向到 dummy.html.erb,我在 routes.rb 中定义为

match '/dummy', to :'page#dummy'

页面是我的 Controller 。

我尝试了以下方法,但我似乎陷入了某些重定向循环。

My Rack 中间件位于/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"

我也试过在我的中间件中调用一个 Controller ,但我又一次陷入了一些重定向循环。我这样从我的中间件类调用 Controller :

  def call (env)
    ...
    status,headers,response=PageController.action("validateAccess").call(env)
  end

在我的 Controller 中:

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

我已经看到在不使用 Rack 中间件的情况下成功完成重定向,例如仅使用 Controller ,但请注意,我需要在我的应用程序运行之前在中间件中执行此操作。

最佳答案

答案很简单,我觉得很傻。问题是,当我重定向到某处说/dummy 时,这又会导致另一次通过 Rack 中间件并再次通过我的 AccessVerifier 代码,重定向到/dummy 并一遍又一遍地执行此操作,从而导致重定向循环。为了修复它,我通过检查传入路径是否包含在我的停止点列表中(/dummy 在该列表中)然后停止来强制停止点。所以伪代码中的一个例子

if path in ListOfAcceptableStoppingPoints
    @app.call(env)

这解决了重定向循环问题,但现在我想知道是否对我的特定情况不使用 rake 中间件会更好,因为我发现现在我正在过滤掉其他东西,例如 Assets 。当然,我可以尝试通过并挑选出我认为需要允许通过的所有内容,但这似乎太乏味且不正确。最终,我似乎需要在轨道级别而不是 Rack 级别进行过滤。

关于ruby-on-rails-3.1 - Rack 中间件如何重定向到我的 Rails 应用程序中的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11512825/

相关文章:

scala - 如何将 request.body 转换为字节数组以计算 MD5?

asp.net-mvc - asp.net razor中有类似eval()的函数吗?

linux-kernel - wait_for_completion 与 wakeup_interr

sql-server - MSDTC 设置/属性正在重置

ios - 我的 iOS 开发者证书或私钥在 git 中吗?

asp.net - 转移到服务器场中的不同服务器时,IsPostBack 为假?

asp.net-mvc-3 - 如何修复来自 Shibboleth 的 SAML SSO 后的浏览器

ruby-on-rails-3 - Rails 应用程序占用所有服务器内存

symfony - doctrine2 ifnull

php - 递归菜单树函数