2009-06-24 7 views
22

J'essaie de créer une méthode d'assistance pour mes liens d'administration. Dans un certain nombre vues que j'ai le codeChemins dynamiques dans 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 %> 

afficher seulement ceux-ci lorsque vous êtes connecté.

Je voudrais faire quelque chose comme ça à leur place

<%= admin_links(model) %> 

et passer le élément actuel dans la méthode d'assistance d'application

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 

Ou certains chose du genre.

Répondre

50

En gros, vous devez transformer le nom de classe du modèle en quelque chose pointant vers le bon chemin.

model_name = m.class.to_s.underscore 

Et puis l'utiliser pour appeler les En aparté, les méthodes de chemin appropriées

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

vous n'avez pas besoin de mettre les link_tos en #{} parce que la fonction retourne simplement une chaîne.

+8

S'il vous plaît voir la réponse de @ v4r, qui est le meilleur disponible maintenant. – aledalgrande

3

Je voudrais utiliser un partiel pour cela - au lieu d'un assistant. Où que vous souhaitez afficher ces liens dans vos points de vue, rendre simplement partielle:

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

En _admin_links.html.erb Il suffit de coller le code d'origine:

<% 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 vous allez utiliser le même code dans plusieurs vues, empaquetez-le comme une vue partielle et rendez-le où vous voulez –

39

Rails fournit des itinéraires polymorphes pour gérer ce problème: http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html

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

Bonne réponse! BTW. Il existe également des aides polymorphes préfixées plus spécifiques. Donc celui-ci peut être raccourci à 'edit_polymorphic_path (modèle)' – rawonstack

+0

Un autre exemple pour "pourquoi j'aime Rails" !! Y a-t-il quelque chose qu'ils n'ont pas pensé?! – gfd