约束失败时从路由重定向

Ros*_*oss 7 routes ruby-on-rails constraints ruby-on-rails-3

我想在路由约束失败时重定向到不同的URL

Route.rb

匹配'/ u'=>'user#signin',: constraints => BlacklistDomain

blacklist_domain.rb

class BlacklistDomain
    BANNED_DOMAINS = ['domain1.com', 'domain2.com']

    def matches?(request)
        if BANNED_DOMAINS.include?(request.host)
            ## I WANT TO REDIRECT HERE WHEN THE CONDITION FAILS
            else
                    return true     
           end

    end
end
Run Code Online (Sandbox Code Playgroud)

zea*_*soi 9

由于Rails路由是按顺序执行的,因此您可以通过以下方式模拟条件登录:

# config/routes.rb
match '/u' => 'controller#action', :constraints => BlacklistDomain.new
match '/u' => 'user#signin'
Run Code Online (Sandbox Code Playgroud)

第一行检查是否满足约束的条件(即,请求是否来自列入黑名单的域).如果满足约束,则将请求路由到controller#action(当然,相应地替换).

如果约束的条件未能满足(即请求未被列入黑名单),则请求将被路由到user#signing.

因为在您的路由中有效地处理了这个条件逻辑,所以可以简化约束代码:

# blacklist_domain.rb
class BlacklistDomain
  BANNED_DOMAINS = ['domain1.com', 'domain2.com']

  def matches?(request)
    if BANNED_DOMAINS.include?(request.host)
      return true     
    end
  end
end
Run Code Online (Sandbox Code Playgroud)