1

我有一个带有大约 60 多个动作的 Rails 控制器。我需要将其更改为仅允许对大约 20 个操作的 POST 请求以及对其余操作的任何请求方法。

有没有办法做到这一点,所以我不必手动指定所有路线都允许的路线?

这就是我目前所拥有的(并且有效):

post_regex = /first_route|second_route/
all_routes_regex = /third_route|fourth_route/
map.connect '/myroute/:id/:action', :controller => 'my_controller', :constraints => {:action => post_regex }, :conditions => { :method => :post }
map.connect '/myroute/:id/:action', :controller => 'my_controller', :constraints => {:action => all_routes_regex }

我尝试创建这样的东西,但它只会导致 RoutingError。

post_regex = /first_route|second_route/
class AllRoutesConstraint
  def self.matches?(request)
    (request.query_parameters[:action] !~ post_regex)
  end
end
map.connect '/myroute/:id/:action', :controller => 'my_controller', :constraints => {:action => post_regex }, :conditions => { :method => :post }
map.connect '/myroute/:id/:action', :controller => 'my_controller', :constraints => {:action => AllRoutesConstraint }
4

1 回答 1

1

如果您愿意在控制器中而不是在 routes.rb 中执行此操作,则应该非常简单。让所有请求类型通过路由文件:

# in config/routes.rb
map.connect '/myroute/:id/:action', :controller => 'my_controller'

然后,过滤控制器中的仅 POST 操作。

# in app/controllers/my_controller.rb
POST_ONLY_ACTIONS = [:first_route, :second_route]

before_filter :must_be_post, :only => POST_ONLY_ACTIONS

# your actions...

protected

def must_be_post
  unless request.method == "POST"
    raise ActionController::MethodNotAllowed.new("Only post requests are allowed.")
  end
end

如果您在 routes.rb 中设置方法,这将获得与 Rails 为您生成的相同的错误和错误消息。

缺点是您的 routes.rb 文件不再是关于允许哪些请求的唯一权威来源。但是,由于您试图从路由文件中删除一些信息(非 POST 请求列表),您可能会发现权衡是可以接受的。

于 2013-05-22T20:51:52.910 回答