каква е правилната конвенция за спокойно маршрутизиране чрез пространства от имена?

Да приемем, че имам модел на разписки и искам да предложа действие на контролер за отпечатване на такъв... Неспокойният начин би бил да направя:

# receipt_controller.rb
  def print
    ...
  end

#routes.rb
  resources :receipts do
    get :print, :on => :member
  end

... Спокойният начин би бил:

# receipt_printings_controller.rb
  def create
    ...
  end

#routes.rb
  resources :receipts
  resources :receipt_printings, :only => :create

Въпросът ми е..... Да кажем, че искам да имам следната структура:

/app
  /controllers
     receipts_controller.rb
     /receipt
       printings_controller.rb

Това би означавало, че класът ми ще изглежда така: class Receipt::PrintingsController ‹ ActiveRecord::Base def create ... end end

Но не знам как да маршрутизирам правилно в този контекст, защото все още трябва да мога да направя:

receipt_printings_path(123), за да получите /receipts/123/printings

Единственият начин, по който знам как да постигна това, е да направя:

#routes.rb
  match "/receipts/:id/printings" => "receipt/printings#create", :as => :receipt_printings
  resources :receipts

Но се чудя дали има по-добър начин?


person patrick    schedule 07.05.2012    source източник
comment
Звучи като въпрос, който трябва да бъде на codereview.stackexchange.com   -  person Aayush Kumar    schedule 07.05.2012


Отговори (3)


Мисля, че можете да направите нещо подобно:

resources :receipts do 
  resources :printings, :controller => "receipt/printings", :only => :create
end

Той ще генерира:

receipt_printings POST /receipts/:receipt_id/printings(.:format) receipt/printings#create

След това за достъп до вашия маршрут:

receipt_printings_path(:receipt_id => @receipt.id)

Надявам се да помогне

person CupraR_On_Rails    schedule 07.05.2012

Ако съм прав, имате нужда от вложен ресурс, вижте това ръководство за релси

person bonyiii    schedule 07.05.2012
comment
доколкото разбирам, вложен ресурс няма да работи с контролер с пространство от имена... (освен ако родителският ресурс също е с пространство от имена, което в този случай не трябва да бъде) - person patrick; 07.05.2012

Можете да използвате вложени маршрути, но по начина, по който прочетох въпроса ви, ми звучи така, сякаш искате пространства от имена. Пространствата от имена може да изглеждат по следния начин:

resources :receipts
namespace :receipts do
  resources :printings
end

Това ще насочи /receipts/printings/:id към app/receipt/printings_controller.rb с идентификатор за отпечатването (не разписката).

Може наистина да искате вложени маршрути. Ако искате да използвате идентификатора на разписката и да имате само едно действие за печат (на разписка), можете да използвате отделен ресурс.

resources :receipts do
  resource :printing
end

Това ще насочи /receipts/:id/print към app/printings_controller.rb, както е показано.

За да организирам контролера за разпечатки в пространство от имена, бих го оставил извън маршрутите, защото това ще се опита да вмъкне друго пространство от имена на разписки в URL адреса. Вместо това използвайте,

resources :receipts do
  resource :printing, :controller => "receipt/printings"
end

Ето как да бъдете RESTful. Възможно е обаче да нямате случай RESTful. Дали печатът наистина създава? Наистина ли прави шоу или актуализация? Ако това е услуга, която не се вписва в операция CRUD, тогава е време да се отклоните от златния път и да продължите напред и да използвате глагол, който не е RESTful.

person Marlin Pierce    schedule 07.05.2012