2009-06-24 5 views
22

Ich versuche, eine Hilfsmethode für meine Administrator-Links zu erstellen. In ganz wenigen Ansichten habe ich den CodeDynamische Pfade 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 %> 

, dass diese nur angezeigt, wenn angemeldet.

ich so etwas wie dies an ihrer Stelle

<%= admin_links(model) %> 

und übergeben Sie tun möchten die aktuelle Artikel in die Anwendung Hilfsmethode

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 

Oder einige Ding von ähnlichem.

Antwort

50

Im Grunde müssen Sie den Klassennamen des Modells in etwas umwandeln, das auf den richtigen Pfad verweist.

model_name = m.class.to_s.underscore 

Und dann verwenden Sie die entsprechenden Pfad Methoden

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

Als Nebenwirkung zu nennen, brauchen Sie nicht die link_tos in #{} zu setzen, weil diese Funktion einfach einen String zurückgibt.

+8

Bitte sehen Sie @ v4r's Antwort, das ist die beste, die jetzt verfügbar ist. – aledalgrande

3

Ich würde eine teilweise dafür - anstelle eines Helfers verwenden. Überall dort, wo Sie diese Links in Ihren Ansichten angezeigt werden sollen, machen Sie einfach den Teil:

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

In _admin_links.html.erb nur den ursprünglichen Code einfügen:

<% 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, wenn Sie den gleichen Code in mehreren Ansichten verwenden möchten, verpacken Sie es als Teilansicht und rendern Sie es, wo immer Sie möchten –

39

Rails bietet polymorphe Routen um dieses Problem zu umgehen: http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html

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

Große Antwort! BTW. Es gibt auch spezifischere präfixierte polymorphe Helfer. So kann man diese zu 'edit_polymorphic_path (model)' ' – rawonstack

+0

verkürzen Ein anderes Beispiel zu" warum ich Schienen liebe "!! Gibt es etwas, an das sie NICHT gedacht haben? – gfd