У меня есть проблема, откуда мне нужны значения, переданные в ПОЛУЧИТЬ запроса, и я не знаю, как настроить определение маршрута.
Мой объект Категории имеет тип (строка), цвет (строка) и много продуктов. Я хочу создать простой веб-сервис, который позволяет вызывающей стороне получить все продукты Категории путем передачи в типе и цвете Категории:
http://www.myapp.com/getProducts?catType=toy&color=red
или?
http://www.myapp.com/categories/getProducts?catType=toy&color=red
Как я определяю корректную маршрутизацию для этой ситуации? Есть ли лучшие способы сделать это Успокоительным способом..., потому что я знаю, что направляющие являются Успокоительными, поэтому если бы существует способ сделать это "правильно" затем, это было бы еще лучше.
Спасибо
Ваш первый пример:
map.getproduct '/getProduct', :controller => 'your_controller', :action => 'your_action'
В контроллере у вас будет catType и цвет в хэше params:
params[:catType]
=> 'toy'
params[:color]
=> 'red'
Есть ли способ лучше? Возможно, да, но это зависит от ваших потребностей. Если у вас всегда будут параметры catType и color, вы можете добавить маршрут следующим образом:
map.getproduct '/getProduct/:catType/:color', :controller => 'your_controller', :action => 'your_action'
У вас будет доступ к этим параметрам с хешем params, как в предыдущем примере. И ваши URL-адреса будут выглядеть так:
www.myapp.com/getProduct/toy/red
Если ваши параметры могут измениться, вы можете использовать подстановку маршрутов:
map.getproduct '/getProduct/*query', :controller => 'your_controller', :action => 'your_action'
Тогда он будет перехватывать все запросы, которые имеют www.my.app.com/getProduct / ...
в начале. Но у вас будет больше работы с контроллером. У вас будет доступ к запросу
с помощью этого:
params[:query]
, а для www.myapp.com/getProduct/color/red/catType/toy
он даст:
params[:query]
=> ['color', 'red', 'catType', 'toy]
Итак, вы придется разбирать его вручную.
Один из способов RESTful сделать это будет включать ресурс продукта, вложенный под ресурс категории, например:
http://www.myapp.com/categories/toy/products?color=red
Ваш routes.rb должен содержать:
map.resources :categories do |category|
category.resources :products
end
Поскольку мой URL выше с использованием Category Атрибут type для маршрутизации, я подразумеваю, что каждый тип уникален, как идентификатор. Это будет означать, что всякий раз, когда вы загружаете категорию в контроллер категорий (или где-либо еще), вам нужно будет загрузить категорию с помощью Category.find_by_type (params [: id])
вместо ] Category.find (параметры [: id])
. Мне нравится такой способ маршрутизации по возможности.
Действие индекса вашего контроллера ProductsController будет искать продукты, используя такие строки, как:
@category = Category.find_by_type(params[:category_id])
@products = @category.products.find(:all, :conditions => { :color => params[:color]} )
Помните, ваша модель категории должна содержать строку:
has_many :products
Вероятно, неплохо было бы принудительно применить это в модели с проверками:
validates_presence_of :type
validates_uniqueness_of :type
Чтобы сделать При работе с маршрутизацией вам также следует перезаписать метод to_param
в модели Category, чтобы он возвращал тип вместо id:
def to_param
self.type
end