Как я могу иметь ресурсный маршрут по умолчанию, включающий атрибуты моей модели? - PullRequest
1 голос
/ 14 марта 2012

(Обратите внимание, что примеры являются упрощением моего варианта использования.)

У меня есть модель Событие и маршрут по умолчанию для отображения одного события:

/events/:id(.:format) ----> activities#show

Теперь у события есть атрибут с именем year, и я также уже принимаю следующий маршрут:

/events/:year/:id(.:format) ----> activities#show

Поскольку по умолчанию используется второй вариант, я хочу, чтобы код, подобный redirect_to @event, приводил пользователя к этому варианту (например, http://localhost:3000/events/2012/1).

Где я могу это определить?

До сих пор я пытался переписать to_param в модели следующим образом:

def to_param
  "#{self.year}/#{self.id}"
end

... но это приведет к заполнению строки params[:id] 2012/1 .

Я хочу, чтобы params[:id] все еще было 1 , в то время как params[:year] должно быть 2012 .

Предоставляет ли Rails стандартный способ сделать это?

... или мне придется написать собственный метод для модели и вызвать его, выполнив что-то вроде этого: redirect_to @event.custom_method_to_create_long_url_variant

Такой метод будетбыстро реализуется, но если Rails может обработать требование с помощью простой настройки, это позволит мне оставить практически весь остальной код без изменений.

РЕДАКТИРОВАТЬ:

Я нашелвыяснилось, что мои params содержали значения (: id и: year), как и ожидалось, при изменении get в функциональном тесте ОТ get :show, id: @event К get :show, id: @event.id.

Теперь вопросэто:

Это просто способ сделать это или я все еще могу поддерживать get :show, id: @event?

1 Ответ

1 голос
/ 14 марта 2012

Что-то вроде этого:

match "/events(/:year)/:id(.:format) => "activities#show"

и получите в свой контроллер

Started GET "/events/2012/12" for 127.0.0.1 at 2012-03-14 17:25:44 +0400
Parameters: {"year"=>"2012", "id"=>"12"}

или без года

Started GET "/events/12" for 127.0.0.1 at 2012-03-14 17:25:44 +0400
Parameters: {"id"=>"12"}

Итак, вы можете использовать в вашем контроллере

params[:id]
params[:year]

И url_helper

match "/events(/:year)/:id(.:format) => "activities#show", :as => :my_event

my_event_path(2012, 12) #=> /eventes/2012/12
my_event_path(@event.id) #=> /events/12
...