2012-04-24 10 views
7

Ho un blocco complesso di tag (<h3>, <p>, ...) che voglio rendere con un collegamento o senza un collegare intorno ad esso in base a una condizione.: Come posso mostrare un blocco con o senza un collegamento basato su una condizione (link_to_if)

che so di link_to_if che funziona così:

<% link_to_if condition, name, path %> 

se la condizione è false solo il nome sarà reso.

E so circa il link_to con &block:

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

Voglio una combinazione di entrambi. Una dichiarazione link_to_if che accetta un &block, in modo che il blocco venga reso senza un collegamento intorno ad esso, se la condizione è false. Purtroppo la dichiarazione link_to_if con un &block non funziona come la dichiarazione :(link_to

Qualcuno ha suggerimenti per me Ogni aiuto è molto apprezzato

risposta

23

ho scritto il mio aiuto per questo:?

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

È possibile utilizzarlo in questo modo:

<%= 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

Penso che mi piaccia. – DiegoFrings

+0

Non so come funziona con il passare tutti i diversi argomenti a 'link_to', ma suppongo che quando hai bisogno di qualcosa di più sofisticato lo capirai;) – klump

+0

Hmmm. Qualcosa è strano con il tuo metodo di aiuto. Se uso l'Helper con '<%= %>' il blocco sarà reso una volta (con un collegamento intorno) se la condizione è vera, ma due volte (senza un link) se la condizione è falsa :( – DiegoFrings

3

Ho appena sovrascritto il metodo incorporato causa l'uso del blocco che offrono davvero non ha molto senso per il nostro uso. Basta aggiungerlo a un helper e questo renderà link_to_if funzionare proprio come link_to.

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

    super *args 
end