我有以下部分内容。它可以在视图中从三个不同的时间调用如下:
<%= 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不是方法。
网址是正确的,但它无法识别为方法。
如果局部变量是字母,如何动态定义skip_contact_email_url为skip_contact_letter_url?
更好的是,我怎样才能有一条能够做出相应行动的命名路线?
答案 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