Как я могу динамически вызывать именованный маршрут в: part in rails? - PullRequest
2 голосов
/ 29 мая 2010

У меня есть следующий частичный. Его можно вызывать из трех разных времен в следующем виде:

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

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

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

Что я сделал, так это создал, каким должен быть настоящий 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 не метод.

URL-адрес правильный, но он не распознается как метод.

  1. Как я могу динамически определить skip_contact_email_url как skip_contact_letter_url, если локальной переменной является буква?

  2. Еще лучше, как я могу иметь один именованный маршрут, который будет выполнять соответствующее действие?

1 Ответ

4 голосов
/ 29 мая 2010

Вы можете использовать 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
...