Вземете име на ресурс от URL, когато използвате персонализиран контролер в Rails

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

map.resources :authors, :controller => 'main'
map.resources :books, :controller => 'main'

Всички те работят добре, създавайки маршрути като /authors/1, /books, /books/55 и т.н. и след това всички в крайна сметка се обработват от „главния“ контролер.

Изглежда обаче не мога да намеря как да получа името на ресурса в контролера, т.е. в действието за индексиране, когато URL адресът е /authors или /books Бих искал да мога да определя кой ресурс е, т.е. Автор или Книга

Не мога да използвам отделни контролери за това.

Това изобщо възможно ли е?


person Community    schedule 17.04.2009    source източник
comment
Вашето твърдение, че не мога да използвам отделни контролери за това, ме кара да заключа, че а) Rails е borked или б) правите нещо друго грешно другаде, което налага това ограничение. Познайте към кое клоня :-)   -  person Darrel Miller    schedule 17.04.2009


Отговори (3)


РЕДАКТИРАНЕ: пълна промяна на отговора, защото беше waaay изключен.

Тъй като променя параметрите, които виждате в действието си, ще трябва да стигнете до действителния uri. Наистина е точно толкова просто, колкото предложи Тери.

 def index
   if request.request_uri =~ /books/
     #...
   else
     # if it is a author
   end
 end

Това сравнява uri адреса на заявката (частта, която би била след localhost:3000) с книги и така можете да видите какво е поискал потребителят.

person vrish88    schedule 17.04.2009
comment
Както посочих в моя въпрос, използвам един и същ контролер и за двата маршрута (основни), така че използването на метода, който описвате, връща името на персонализирания контролер, а не името на ресурса. В този случай основният. - person ; 17.04.2009
comment
А, добре, благодаря, че ми съобщи. Актуализирах отговора си, така че той действително да отговори на въпроса ви;) - person vrish88; 17.04.2009

Не мисля, че има нещо подобно на .resource метод, но бихте могли да погледнете request.request_uri, който във вашия случай би върнал неща като /authors или /books и може да действа съответно.

person Terry    schedule 17.04.2009

Вижте раздела „Маршрути по подразбиране и параметри по подразбиране“ на ActionController::Routing документация. Можете да програмирате във вашите маршрути произволни допълнителни параметри, които искате да бъдат изпратени на вашия контролер.

Разглеждането на URI на заявката ще ви принуди да поддържате маршрутите и контролерите в синхрон, което ще направи кода ви по-крехък и по-малко лесен за повторно използване. Избягвайте, ако е възможно.

person asplake    schedule 19.05.2009