2012-06-29 5 views
4

Я работаю над приложением Rails, и я ищу способ маршрутизации на разные действия в контроллере на основе наличия параметров в URL-адресе.Маршрутизация Rails на основе параметров

Например, я хочу website.com/model, чтобы добраться до model#index, однако я хочу, чтобы website.com/model?opt=dev переехал на model#show. Есть ли способ сделать это?

+0

Я считаю, что вы можете использовать ': constraints' возможность получить такое поведение. Документация: http://guides.rubyonrails.org/routing.html#segment-constraints. – MurifoX

ответ

4

Используйте ограничения маршрута, чтобы посмотреть объект запроса и посмотреть, есть ли у него параметры URL. Если вы используете спокойные маршруты, вы хотите поставить это «одноразовое» перед спокойным маршрутом. Что-то вроде этого:

get 'users' => 'users#show', constraints: { query_string: /.+/ } 
resources :users 

Так что это говорит, что если вы спрашиваете «/ пользователи неавтоматическим = Dev?», То он будет соответствовать вашему особому случаю. В противном случае он переходит к вашему нормальному спокойному маршруту к действию индекса. Затем ваше действие # show show должно знать, чтобы выбрать параметр [: opt] и сделать с ним все.

Кроме того, обратите внимание, что регулярное выражение очень свободно, и оно просто проверяет ЛЮБОЙ параметр ... вы захотите затянуть его, чтобы он соответствовал тому, что вы пытаетесь сделать.

+0

А, хороший ответ. Я дошел до использования ограничений, но я не знал о query_string. Что содержится в этом? Как я могу использовать это для поиска конкретных вещей, таких как 'opt' или другие параметры. Мой вариант использования требует, чтобы я различал разные вещи, такие как 'opt',' email' и т. Д. – finiteloop

+0

Запрос_string является частью [объекта запроса] (http://guides.rubyonrails.org/action_controller_overview.html#the- запрос-объект). Это буквально все после "?" в URL. Пример, который я опубликовал, как я уже сказал, использует очень общее регулярное выражение. Если вам нужна больше логики, чем простое регулярное выражение, я бы, вероятно, поместил это в контроллер, а не в маршруты для удобства обслуживания. – smitjel

1

Не совсем то же самое, но если вы пришли к этому сообщению и задавались вопросом, как это сделать через POST, вы можете сделать это на основе параметров request_paramters.

для routes.rb ..

module MyConstraintName 
extend self 
    def matches?(request) 
    request.request_parameters["routeFlag"] == "routeToModelShow" 
    end 
end 

match "pages/:id", :via=>:post, :controller=>"model", :action=>"show", :constraints => MyConstraintName 

и в вашей форме, например ..

<%= hidden_field_tag :routeFlag, "routeToModelShow" %> 
Смежные вопросы