开发者

Rails routes matching query parameters

Rails routes are great for matching RESTful style '/' separated bits of a URL, but can I match query parameters in a map.connect config. I want different controllers/actions to be invoked depending on the presence of a parameter after the '?'.

I was trying something like this...

map.connect "api/my/path?apple=:applecode", :controller => 'apples_controller', :action => 'my_action'
map.conn开发者_JAVA技巧ect "api/my/path?banana=:bananacode", :controller => 'bananas_controller', :action => 'my_action'

For routing purposes I don't care about the value of the parameter, as long as it is available to the controller in the params hash


The following solution is based on the "Advanced Constraints" section of the "Rails Routing from the Outside In" rails guide (http://guides.rubyonrails.org/routing.html).

In your config/routes.rb file, include a recognizer class have a matches? method, e.g.:

class FruitRecognizer
  def initialize(fruit_type)
    @fruit_type = fruit_type.to_sym
  end

  def matches?(request)
    request.params.has_key?(@fruit_type)
  end
end

Then use objects from the class as routing constraints, as in:

map.connect "api/my/path", :contraints => FruitRecognizer.new(:apple), :controller => 'apples_controller', :action => 'my_action'


Unless there is a concrete reason why you can't change this, why not just make it restful?

map.connect "api/my/path/bananas/:id, :controller => "bananas_controller", :action => "my_action"

If you have many parameters, why not use a POST or a PUT so that your parameters don't need to be exposed by the url?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜