Есть ли способ проверить параметры и выбрать маршруты на основе параметров в рельсах? - PullRequest
2 голосов
/ 30 июля 2010

Я ищу способ определения маршрутов на основе параметра запроса. Например, я хочу направить запрос к веб-контроллеру, если он имеет параметры [: web], и к iPhone, если у него есть параметры [: iphone],Можно ли сделать так, чтобы имена маршрутов были одинаковыми, но в зависимости от параметра направлялись на разные контроллеры / действия?

Ответы [ 3 ]

0 голосов
/ 30 июля 2010

Расширяя ответ @ lakshmanan, вы можете сделать это:

Добавьте это в ваши маршруты.rb:

map.named_route '/:controller/:action/:platform'

По вашему мнению,

<%= link_to "Blah blah", named_route_path(:controller => "some_controller",
                                          :action => "some_action",
                                          :platform => "some_platform")

В вашем контроллере some_controller,

def some_action
   if params[:platform] == "web"
        #DO SOMETHING
   elsif params[:platform] == "iphone"
        #DO SOMETHING
   else
        #DO SOMETHING
   end
end
0 голосов
/ 30 июля 2010

Предполагая, что есть очень веская причина, чтобы один контроллер принял это действие (если есть общий код ... переместите его в вспомогательный метод или модель и используйте информацию агента пользователя или именованные маршруты в ваших интересах), проверьте параметр и перенаправьте на соответствующий контроллер и выполните действие:

def some_action 
   # some shared code here
   if params[:platform] == 'iphone'
     redirect_to :controller => 'foo', :action => 'bar'
   elsif params[:platform] == 'web'
     redirect_to :controller => 'baz', :action => 'baq'
   else
     # default controller and action here
   end
end

Если вы действительно хотите, чтобы указанный маршрут отображался на разные контроллеры, вам нужно жестко закодировать строку платформы:

map.connect '/foo/bars/:id/iphone', :controller => 'iphone',:action=>'some_action'
map.connect '/foo/bars/:id/web', :controller => 'web',:action=>'some_action'

UPDATE0

Начиная с здесь , вы можете попробовать map.with_options(:conditions => ... )

0 голосов
/ 30 июля 2010

Возможно, если вы определите маршрут (или именованный маршрут), как показано ниже в вашем файле rout.rb

map.connect '/:controller/:action/:platform',:controller => 'some controller name',:action=>'some action'

если вы справитесь с этим в своем действии, вы можете использовать как params [: platform]

Узнайте больше об именованных маршрутах, если вы настроите больше на этом. Что касается вашей проблемы, я надеюсь, что приведенный выше код решает проблему

...