2010-05-29 2 views
2

У меня есть следующие частичные. Он может быть вызван из трех раз в представлении следующим образом:Как я могу динамически вызывать именованный маршрут в: частичном в рельсах?

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

В каждом случае, вызов, электронная почта, письмо обратитесь к конкретному экземпляру модельного вызова, электронной почты или письма.

Вот что я пытался сделать и концептуально, что бы я хотел сделать: назначьте маршрут на основе имени класса, которое было передано в: event из: partial.

Что я сделал, так это то, что должно быть на самом деле. «Текст» этого является правильным, но, похоже, не признает его как именованный маршрут.

<!-- 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. Он генерирует соответствующий маршрут на основе типов элементов:

Edit: Маршрут генерируется на основе класса пластинки, так что если вы передаете :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

+0

значение для события происходит через: locals hash – Angela

+0

Да, вы назначаете любой объект ActiveRecord как ': event', а затем его используете. См. Править. – Voyta

Смежные вопросы