Rails-маршруты соответствуют параметрам запроса - PullRequest
7 голосов
/ 11 мая 2010

Маршруты Rails отлично подходят для соответствия RESTful-стилю '/' отдельных битов URL, но я могу сопоставить параметры запроса в конфигурации map.connect. Я хочу, чтобы различные контроллеры / действия вызывались в зависимости от наличия параметра после '?'.

Я пытался что-то вроде этого ...

map.connect "api/my/path?apple=:applecode", :controller => 'apples_controller', :action => 'my_action'
map.connect "api/my/path?banana=:bananacode", :controller => 'bananas_controller', :action => 'my_action'

Для целей маршрутизации меня не интересует значение параметра, если оно доступно для контроллера в хэш-коде params

.

Ответы [ 2 ]

10 голосов
/ 02 октября 2011

Следующее решение основано на разделе «Дополнительные ограничения» в руководстве по рельсам «Маршрутизация с внешней стороны» (http://guides.rubyonrails.org/routing.html).

В вашем файле config / rout.rb включить в класс распознавателя совпадения? метод, например ::100100

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

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

Затем используйте объекты из класса в качестве ограничений маршрутизации, например:

map.connect "api/my/path", :contraints => FruitRecognizer.new(:apple), :controller => 'apples_controller', :action => 'my_action'
1 голос
/ 28 декабря 2010

Если нет конкретной причины, почему вы не можете изменить это, почему бы просто не сделать это успокоительным?

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

Если у вас много параметров, почему бы не использовать POST или PUT, чтобы ваши параметры не отображались в URL-адресе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...