Как создать собственный маршрут в рельсах, где я передаю идентификатор существующей модели? - PullRequest
3 голосов
/ 11 июня 2010

Я создал следующий маршрут:

  map.todo "todo/today",
            :controller => "todo",
            :action => "show_date"

Первоначально действие show_date и связанный вид отображали все действия, связанные с этим днем ​​для всех кампаний.

Это закончилось очень медленно в базе данных ... это сгенерировало бы приблизительно 30 записей, но все еще было медленным.

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

Если кто-то нажал на ссылку, связанную с campaign_id = 1, я хочу, чтобы он пошел по следующему маршруту:

todo/today/campaign/1

Тогда я хотел бы знать, как узнать, что «1» - это аргумент campaign_id в контроллере, а затем просто сделать свое дело.

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

ПРИМЕЧАНИЕ. Возможно, проблема на самом деле в том, что я написал запросы медленно, а sqlite не является представителем того, как он будет работать, и в этом случае этот обходной путь не нужен, но сейчас, Мне нужен способ быстро вернуться ко всему списку.

Ответы [ 2 ]

4 голосов
/ 11 июня 2010

Код выше @Damien правильный, но неполный. Должно быть:

map.todo "todo/today/campaign/:id", :controller => "todo", :action => "show_date"

в ваших взглядах все, что вам нужно сделать, это:

<%= link_to "Campaign 1", todo_path(:id => 1) %>

или просто

<%= link_to "Campaign 1", todo_path(1) %>

и идентификатор конкретной кампании можно получить с помощью params[:id] в вашем действии.

И да, sqlite не готова к производству.

РЕДАКТИРОВАТЬ: Последняя часть довольно легко реализовать:

Однако вы должны немного изменить маршрут, Маршрут теперь станет

map.todo "todo/today/:campaign/:id", :controller => "todo", :action => "show_date"

в ваших взглядах:

<%= link_to "Campaign 1", todo_path(:campaign => "campaign", :id => 1) %>

В вашем контроллере todo действие show_date:

def show_date

#IF YOU ARE USING THIS REPEATEDLY IN LOTS OF DIFFERENT ACTIONS THEN A BETTER PLACE FOR THIS WOULD BE AS A HELPER IN application_controller.rb

 if params[:id].nil? && params[:campaign].nil?
    #DO SOMETHING WHEN BOTH ARE NIL,
 elsif params[:campaign]!="campaign"
    #DO SOMETHING WITH CAMPAIGN BEING SOMETHING OTHER THAN "CAMPAIGN"
 elsif params[:campain]=="campaign" && params[:id].nil?
    #DO SOMETHING WITH ID BEING NIL.
 else
    #FIND YOUR CAMPAIGN HERE.
 end
end

Надеюсь, это поможет. :)

0 голосов
/ 11 июня 2010

Просто со следующим:

map.todo "todo/today/:id",
        :controller => "todo",
        :action => "show_date"

Это создаст /todo/today/:id url, где id - это то, что вы задали в URL.
Затем вы можете получить к нему доступ в вашем контроллере с помощью params[:id].

Возможно, вас заинтересует чтение Rails Routing from Outside In , особенно раздел о ресурсах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...