2009-06-24 15 views
22

Estoy intentando crear un método de ayuda para mis enlaces de administrador. En un buen número de vistas tengo el códigoDynamic Paths in Helper

<% if current_user %> 
<%= link_to "Edit", edit_model_path(model) %> 
<%= link_to "New", new_model_path %> 
<%= link_to "Delete", model, :confirm => "You're a Noob", :method 
=> :delete %> 
<% end %> 

que sólo muestran estos cuando se haya identificado.

me gustaría hacer algo como esto en su lugar

<%= admin_links(model) %> 

y pasar el elemento actual en el método de ayuda de la aplicación

def admin_links(m) 
if current_user 
    a = "#{link_to "edit" edit_m_path(m)}" 
    a << "#{link_to "new" new_m_path}" 
    a << "#{link_to "Delete", m, :confirm => "Your a Noob", :method 
=> :delete}" 
end 
end 

O algunos cosa de eso.

Respuesta

50

básicamente necesita transformar el nombre de clase del modelo en algo que apunte a la ruta correcta.

model_name = m.class.to_s.underscore 

Y luego usarlo para llamar a los métodos apropiados de ruta

link_to "edit", send("edit_#{model_name}_path", m) 

Dicho sea de paso, no es necesario poner los link_tos en #{} porque esa función simplemente devuelve una cadena.

+8

Consulte la respuesta de @ v4r, esa es la mejor disponible ahora. – aledalgrande

3

Utilizaría un parcial para esto, en lugar de un ayudante. Dondequiera que desea mostrar estos enlaces en sus puntos de vista, simplemente hacer que el parcial:

<%= render :partial => "admin_links", :locals => { :model => model } %> 

En _admin_links.html.erb acaba de pegar el código original:

<% if current_user %> 
    <%= link_to "Edit", edit_model_path(model) %> 
    <%= link_to "New", new_model_path %> 
    <%= link_to "Delete", model, :confirm => "Your a Noob", :method => :delete %> 
<% end %> 
+0

+1, Daniel Pietzsch! Bob, si vas a utilizar el mismo código en varias vistas, empaquétalo como vista parcial y renderízalo donde quieras –

39

rieles proporciona rutas polimórficos para manejar este problema: http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html

= link_to "Edit", polymorphic_path(model), :method => :put 
+3

¡Excelente respuesta! BTW. También hay ayudantes polimórficos prefijados más específicos. Así que este se puede acortar a 'edit_polymorphic_path (model)' – rawonstack

+0

¡Otro ejemplo de "por qué amo Rails" !! ¿Hay algo en lo que NO pensaron? – gfd