2009-06-24 12 views
22

Sto provando a creare un metodo di supporto per i miei collegamenti di amministrazione. In un bel paio di viste Ho il codicePercorsi dinamici 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 %> 

da visualizzare solo questi quando loggato.

Vorrei fare qualcosa di simile al loro posto

<%= admin_links(model) %> 

e passare il voce corrente nel metodo helper dell'applicazione

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 alcuni cosa del genere.

risposta

50

in pratica è necessario trasformare il nome classe del modello in qualcosa che punta al percorso corretto.

model_name = m.class.to_s.underscore 

E poi usarlo per chiamare i metodi percorso appropriato

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

Per inciso, non è necessario mettere i link_tos in #{} perché quella funzione restituisce semplicemente una stringa.

+8

Si prega di vedere la risposta di @ v4r, che è la migliore disponibile ora. – aledalgrande

3

Vorrei usare un partial per questo - invece di un helper. Ovunque si desidera visualizzare questi collegamenti nel vostro punto di vista, è sufficiente rendere il parziale:

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

In _admin_links.html.erb basta incollare il codice originale:

<% 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, se hai intenzione di usare lo stesso codice in più viste, impacchettalo come vista parziale e rendilo dove vuoi –

39

Rails fornisce percorsi polimorfici per gestire questo problema: http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html

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

Ottima risposta! BTW. Ci sono anche aiutanti polimorfici prefissati più specifici. Quindi questo può essere abbreviato in 'edit_polymorphic_path (model)' – rawonstack

+0

Un altro esempio di "why I love Rails" !! C'è qualcosa a cui NON hanno pensato ?! – gfd