Rails路由强制执行控制器继承

时间:2011-12-15 07:23:05

标签: ruby-on-rails ruby-on-rails-3 rails-routing

有没有办法强制控制器继承路由声明中的另一个?例如,如果B类是A类的子类,则允许它使用该路由。像这样的东西?

match '/login/:controller', :constraint => { :inherits => A }

更新

作为一个更具体的例子,我有一个OAuthController接受来自多个来源的登录。让我们说谷歌,Facebook和Twitter。我有一个GoogleController,FacebookController和TwitterController,它们都是OAuthController的子类。所以我现在接受以下路线:

/login/google
/login/facebook
/login/twitter

我可能随时添加或删除其他人,但我不想改变我的路线。我也只想让:controller成为:OAuthController的子类。有没有办法强制执行?

1 个答案:

答案 0 :(得分:1)

我认为没有开箱即用的支持。但是,可能有办法实现。看看"Rails Guides to Routing, Advanced Constraints"。它使用的request object并不是您想要的,但可能就足够了。

这个想法是这样的:

  • 使用必要的方法实现约束。
  • 在方法matches?(request)中,执行您想要证明的内容。
  • 通过添加路径约束来集成它:

    match "*path" => "login/:action",
      :constraints => LoginConstraint.new
    

这是实施的代码:

class BlacklistConstraint
  def initialize
    ... # necessary initialization here
  end

  def matches?(request)
    ... # Here is your check that returns true or false
  end
end