2010-05-29 74 views
2

我有以下部分。這可以從三個不同的時間在視圖中被稱爲如下:我該如何動態調用rails中的partial:命名的路由?

<%= render :partial => "contact_event", 
    :collection => @contacts, 
     :locals => {:event => email} %> 

二時間:

<%= render :partial => "contact_event", 
    :collection => @contacts, 
     :locals => {:event => call} %> 

第三次:

<%= render :partial => "contact_event", 
    :collection => @contacts, 
     :locals => {:event => letter} %> 

在每一種情況下,打電話,發電子郵件,信件請參考Model Call,Email或Letter的特定實例。

下面是我試圖做的和概念上我想要做的:根據從部分傳遞給:事件的類名分配路由。

我所做的是創建實際的url應該是什麼。它的'文本'是正確的,但似乎沒有認識到它是一個命名路線。

<!-- provide a link to skip this item --> 
<% url = "skip_contact_#{event.class.name.tableize.singularize}_url" %> 
<%= link_to_remote "Skip #{url} Remote", 
    :url => send("#{url}(contact_event, event)") 
    :update => "update-area-#{contact_event.id}-#{event.id}" %> 
<span id='update-area-<%="#{contact_event.id}-#{event.id}"%>'> </span> 

以上的結果:當事件傳遞了一個電子郵件的實例,例如,它說:

skip_contact_email_url不是方法。

該網址是正確的,但它不承認作爲一種方法。

  1. 如何動態定義skip_contact_email_url是skip_contact_letter_url如果局部變量是信?

  2. 更好的是,我怎麼能有一個命名的路線,將做適當的行動?

回答

4

您可以使用polymorphic_url

編輯:基於記錄的類生成的路線,所以如果你通過:event => call:event => email,它的工作是這樣的:

# event.class == Email 
polymorphic_url([contact_event, event], :action => :skip) 
#=> /contact_events/:contact_event_id/emails/:id/skip 

# event.class == Call 
polymorphic_url([contact_event, event], :action => :skip) 
#=> /contact_events/:contact_event_id/calls/:id/skip 

它根據項目類型生成相應的路由

EDIT2: 路線:

map.resources :contacts do |contact| 
    contact.with_options :member => {:skip => : ... [get/post - what you have] } do |c| 
    c.resources :letter 
    c.resources :emails 
    c.resources :calls 
    end 
end 
+0

我可以動態地分配事件中的值嗎?這就是我想要做的事情。 – Angela 2010-05-29 15:58:18

+0

事件的值是通​​過:locals散列 – Angela 2010-05-29 15:58:39

+0

是的,您將任何ActiveRecord對象分配爲':event',然後使用它。請參閱編輯。 – Voyta 2010-05-29 17:40:49