2012-04-24 1 views
7

Ich habe einen komplexen Block von Tags (<h3>, <p>, ...), die ich mit einer Verbindung oder ohne eine Link um es basierend auf einer Bedingung.Rails: Wie kann ich einen Block mit oder ohne einen Link basierend auf einer Bedingung (link_to_if) zeigen

Ich weiß über link_to_if, die wie das funktioniert:

<% link_to_if condition, name, path %> 

, wenn die Bedingung false ist nur der Name wird gemacht werden.

Und ich weiß, über die link_to mit &block:

<% link_to path do %> 
    [complex content] 
<% end %> 

ich eine Kombination aus beidem wollen. Eine link_to_if Anweisung, die eine &block akzeptiert, so dass der Block ohne eine Verbindung um es gerendert wird, wenn die Bedingung false ist. Leider ist die link_to_if Anweisung mit einem &block funktioniert nicht wie die link_to Aussage :(

Hat jemand einen Vorschlag für mich Jede Hilfe sehr

geschätzt

Antwort

23

ich meine eigenen Helfer für diese schrieb:

def link_to_if_with_block condition, options, html_options={}, &block 
    if condition 
     link_to options, html_options, &block 
    else 
     capture &block 
    end 
    end 

Sie können es wie folgt verwenden:

<%= link_to_if_with_block true, new_model_path { "test" } %> 
<%= link_to_if_with_block true, new_model_path do %> 
    Something more complicated 
<% end %> 
+0

Ich denke, dass ich das mag. – DiegoFrings

+0

Ich weiß einfach nicht, wie es mit der Übergabe der verschiedenen Argumente an "link_to" funktioniert, aber ich denke, wenn Sie etwas anspruchsvolleres brauchen, werden Sie es herausfinden;) – klump

+0

Hmmm. Etwas ist seltsam mit deiner Helfermethode. Wenn ich den Helper mit '<%= %>' verwende, wird der Block einmal gerendert (mit einem Link darum), wenn die Bedingung wahr ist, aber zweimal (ohne Verbindung), wenn die Bedingung falsch ist :( – DiegoFrings

3

Ich habe nur die eingebaute Methode Ursache überschrieben die Blockbenutzung, die sie bieten, macht wirklich keinen Sinn für unsere Verwendung. Fügen Sie es einfach zu einem Helfer hinzu und das macht link_to_if genauso wie link_to.

def link_to_if(*args,&block) 
    args.insert 1, capture(&block) if block_given? 

    super *args 
end 
Verwandte Themen