2010-06-11 48 views
3

我创建了以下路线:如何在导轨中创建自定义路线,并传递现有模型的ID?

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

原来,“SHOW_DATE”行动和相关视图将显示当天所有所有广告活动相关的活动。

这最终导致数据库非常缓慢......它会产生大约30条记录,但仍然很慢。

所以,我正在考虑创建一个部分,首先单独列出这些活动。

如果有人用CAMPAIGN_ID = 1相关的链接上点击,我希望它去下面的路线:

todo/today/campaign/1 

然后,我想知道如何知道“1”是CAMPAIGN_ID在控制器中,然后做它的事情。

我想要一个独特的URL的原因是,我可以缓存这个列表。我必须继续回到这一点,它很慢。

注意:这可能是问题的实际是我写了一个缓慢的查询和sqlite并不代表它将如何在生产中,在这种情况下,这种解决方法是不必要的,但现在,我需要一种快速回到整个列表的方式。

回答

4

@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) %>

和特定活动ID可以使用取params[:id]在你的行动。

是的,sqlite没有生产准备。

编辑:后半部分是很容易实现:

但是,你要稍微改变路线, 路线现在成了,

map.todo "todo/today/:campaign/:id", :controller => "todo", :action => "show_date" 
在你的看法

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

在你的待办事项控制器,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

谢谢...让我试试这个 - 想知道是否应该采取任何行动之前先移植到mysql – Angela 2010-06-16 03:41:33

+0

我建议去postgresql。如果您有任何在heroku上部署应用程序的计划。 – 2010-06-16 06:02:22

+0

是的,把它带到heroku ....这不会改变这个解决方案,是吗? – Angela 2010-06-19 18:01:43

0

只是以下几点:

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

这将创建/todo/today/:id的网址,让id是无论你在URL中设置。
然后,您可以使用params[:id]在您的控制器中访问它。

您可能有兴趣阅读Rails Routing from the Outside In,尤其是资源部分。

+0

谢谢让我试试这个 – Angela 2010-06-16 03:41:09

相关问题