如何在一个:partial in rails中动态调用命名路由?

时间:2010-05-29 07:34:53

标签: ruby-on-rails dynamic routes

我有以下部分内容。它可以在视图中从三个不同的时间调用如下:

 <%= 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} %>

在每种情况下,电话,电子邮件,信件都是指模型通话,电子邮件或信件的特定实例。

以下是我尝试做的事情,从概念上讲我想做的事情:根据已从:partial 传递给:event的类名指定路线。

我所做的是创建实际网址应该是什么。它的“文本”是正确的,但似乎并不认为它是一条命名路线。

 <!-- 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. 更好的是,我怎样才能有一条能够做出相应行动的命名路线?

1 个答案:

答案 0 :(得分: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