Маршрутизация направляющих со строкой запроса

У меня есть проблема, откуда мне нужны значения, переданные в ПОЛУЧИТЬ запроса, и я не знаю, как настроить определение маршрута.

Мой объект Категории имеет тип (строка), цвет (строка) и много продуктов. Я хочу создать простой веб-сервис, который позволяет вызывающей стороне получить все продукты Категории путем передачи в типе и цвете Категории:

http://www.myapp.com/getProducts?catType=toy&color=red

или?

http://www.myapp.com/categories/getProducts?catType=toy&color=red

Как я определяю корректную маршрутизацию для этой ситуации? Есть ли лучшие способы сделать это Успокоительным способом..., потому что я знаю, что направляющие являются Успокоительными, поэтому если бы существует способ сделать это "правильно" затем, это было бы еще лучше.

Спасибо

7
задан Ryan Ferretti 13 February 2010 в 14:23
поделиться

2 ответа

Ваш первый пример:

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]

Итак, вы придется разбирать его вручную.

11
ответ дан 6 December 2019 в 14:04
поделиться

Один из способов 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
4
ответ дан 6 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: