Link_to con il blocco

Ciao
ho un link su una pagina fatto cosi’:

<%= link_to “Message”, :controller => “messages”,:action => “inbox”%>

e funziona alla grande.

Ora pero’ voglio aggiungere il numero di messaggi non letti al link, e
ho provato a fare cosi’:

<% link_to(“inbox”, :controller => “messages”,:action => “inbox”) do %>
Messages
<% if
(@unread_message=Recipient.unread_message(current_user.id).length) >0 %>
(<%= @unread_message %>)
<% end %>
<% end %>

Ma non funziona. in pratica il :controller e :action non vengono presi
in considerazione. Ma viene preso in cosiderazione solo il primo “inbox”

Come posso fare?

Grazie
ciao
Alessandro

ok, partiamo dal presupposto che non stiamo usando php.

il tuo primo link funziona si, ma non usi restful, sarebbe meglio
avere una cosa del tipo

<%= link_to “Messages”, messages_path %>

per quanto riguarda il secondo è un qualche cosa di incomprensibile,
suppongo che il tuo framework rails sia dello stesso parere, non sa
semplicemente che dire, sta lì, forse ti osserva :]

forse stai sbagliando approccio, unread_messages andrebbe definito nel
modello User.

current_user.unread_messages.empty? mi sembra leggermente meglio.

cmq resta il fatto che non capisco cosa vuoi fare dentro al “do” (che
ovviamente link_to non accetta)

per passare un parametro con il link_to puoi fare una cosa del tipo

<%= link_to “Messages”, messages_path(:mio_parametro => ‘banana’) %>

oppure se sei un tipo un po più rude

<%= link_to “Messages”, :controller => :messages, :action
=> :index, :mio_parametro => ‘banana’ %>

Q

Andrea C. wrote:

ok, partiamo dal presupposto che non stiamo usando php.

il tuo primo link funziona si, ma non usi restful, sarebbe meglio
avere una cosa del tipo

<%= link_to “Messages”, messages_path %>

si l’avevo letto… ma (per mia ignoranza) non mi trovo molto con i
path…
correggimi se sbaglio dovrei definire dentro routes.rb una riga cosi’:

map.messages ‘/messages/inbox’, :controller => “messages”,:action =>
“inbox”

ma il vantaggio quale è?

forse stai sbagliando approccio, unread_messages andrebbe definito nel
modello User.
current_user.unread_messages.empty? mi sembra leggermente meglio.

si, hai ragione…

cmq resta il fatto che non capisco cosa vuoi fare dentro al “do” (che
ovviamente link_to non accetta)

per passare un parametro con il link_to puoi fare una cosa del tipo

aspetta, mi sono spiegato male…
lo scopo non è passare un parametro, ma semplicemente visualizzare nel
link il numero di messaggi non letti: vorrei ottenere questo:

<a href="/messages/inbox">
  Message
  <span class="lblBold">(2)</span>
</a>

(mentre invece ottengo questo)

<a href="inbox" action="inbox" controller="messages">
  Messages
  <span class="lblBold">(2)</span>
</a>

Grazie, anche del consiglio su dove mettere gli unread message…

Ciao

Andrea C. wrote:

On 26 Mar 2009, at 22:27, Alessandro A. wrote:

dopo che hai definito questa route prova a vedere che url ti genera
lanciando “rake routes”

grazie, devo mettermi a studiamelo con calma

lo scopo non � passare un parametro, ma semplicemente visualizzare nel
Messages
(2)

Grazie, anche del consiglio su dove mettere gli unread message…

<%= link_to “Messages(#{current_user.unread_messages.length)”,
user_messages_path(current_user) %>

oppure in modo medievale

<%= link_to
“Messages(#{current_user.unread_messages.length)”, :controller
=> :messages, :action => :index, :user_id => current_user %>

si, ok, ma io tentavo la strada del block per avere il numerino in
grassetto…
Ora per questo esempio specifico potrei anche rinunciare al bold, ma mi
interessava comunque capire la fattibilità .

cmq sul serio, non � php :]

:slight_smile: guarda php è un linguaggio che non conosco per nulla…
io provengo principalmente da java (e prima di java c, c++) e in
quest’ultimo anno mi sono messo a studiare per conto mio un po’ ruby e
un po’ python.
php al momento l’ho trascurato (non vorrei fare un minestrone e non
concludere nulla).

Ciao, e grazie!

On 26 Mar 2009, at 22:27, Alessandro A. wrote:

correggimi se sbaglio dovrei definire dentro routes.rb una riga cosi’:

map.messages ‘/messages/inbox’, :controller => “messages”,:action =>
“inbox”

ma il vantaggio quale è?

tutti i controller funzionano nello stesso modo con gli stessi metodi,
utilizzi il controller come una risorsa sequando il pattern CRUD come
per i modelli.
il vantaggio è che hai delle url sensate, codice più semantico e
leggibile, ovviamente ti aiuta anche a riutilizzare il codice, ad
esempio utilizzando stessi controller ma con url e quindi compiti
diversi, se nella tua app hai messaggi magari vuoi utilizzarli in modo
diverso (polimorfismo) per associarli a utenti o gruppi avendo cose
del tipo Users/1/messages oppure groups/1/messages

se da console lanci questo comando e vedi tutte le routes già definite

rake routes
o magari (sperando che nn hai windows)
rake routes | grep BLALBABLA

come hai detto tu hai routes.rb per definire TUTTE le tue routes e
come sono associate fra di loro
ah la tua definizione della route è medievale, se il msg è associato
all utente dovresti fare una cosa del tipo

map.resources :users do |users|
users.resources :message
end

dopo che hai definito questa route prova a vedere che url ti genera
lanciando “rake routes”

forse stai sbagliando approccio, unread_messages andrebbe definito
nel
modello User.
current_user.unread_messages.empty? mi sembra leggermente meglio.

si, hai ragione…
grazie :]
lo scopo non è passare un parametro, ma semplicemente visualizzare nel
Messages
(2)

Grazie, anche del consiglio su dove mettere gli unread message…

<%= link_to “Messages(#{current_user.unread_messages.length)”,
user_messages_path(current_user) %>

oppure in modo medievale

<%= link_to
“Messages(#{current_user.unread_messages.length)”, :controller
=> :messages, :action => :index, :user_id => current_user %>

cmq sul serio, non è php :]

Q

Andrea C. wrote:

On 27 Mar 2009, at 00:21, Alessandro A. wrote:

visualizzare nel
Messages
(2)

Grazie, anche del consiglio su dove mettere gli unread message…

<%= link_to “#{…}” …

giusto…
ma con il block non c’era proprio modo (ormai mi è rimasta la curiosità )

Grazie

Ciao Alessandro,
perdonami se mi intrometto ma non ho capito se riesci a contare i
messaggi non letti.

Luigi

On 27 Mar 2009, at 00:21, Alessandro A. wrote:

visualizzare nel
Messages
(2)

Grazie, anche del consiglio su dove mettere gli unread message…

<%= link_to “#{…}” …

Il 27 marzo 2009 10.06, Alessandro A. [email protected] ha scritto:

ma con il block non c’era proprio modo (ormai mi è rimasta la curiosità)

ciao, non sono intervenuto finora perché non l’ho mai usato ma, per
quanto tutti ti stiano dicendo che link_to col block non c’entra
niente, mi sembrava di ricordare distintamente che in rails 2.2 (o
2.3?) hanno introdotto il block in link_to; ho controllato e qui:

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#M001565

si vedono esempi tipo:

<% link_to(@profile) do %>
<%= @profile.name %>Check it out!!
<% end %>

pietro

Luigi M. wrote:

Ciao Alessandro,
perdonami se mi intrometto ma non ho capito se riesci a contare i
messaggi non letti.

Luigi

Ciao,
riesco riesco, quella parte funzionava.
Il suggerimento di Q è (o almeno io l’ho interpretato cosi’) più su come
ho pensato gli oggetti:
logicamente è più corretto che io parta dall’utente per sapere quanti
messaggi deve ancora leggere, ma non ci avevo pensato.
Il metodo invece di essere sui destinatari dovrebbe essere sull’utente.
Probabilmente mi è venuto da metterlo li, perchè la tabella destinatari
ha la colonna che mi indica se il messaggio è stato letto…
(in pratica è user_id, message_id, is_read)

Comunque funziona (e al momento ancora non l’ho spostato su user).

Ciao
Alessandro

Ciao Alessandro,
ciao a tutti,

se ho capito bene il tuo primo messaggio, il problema sta nel modo in
cui passi gli argomenti a link_to: quando usi un block, gli argomenti
di link_to devono scalare di posto. Il tuo codice dovrebbe diventare:

<% link_to(:controller => “messages”,:action => “inbox”) do %>
[contenuto del blocco, scritto come l’avevi scritto tu o ripensato
come suggerito da Andrea]
<% end %>

Te ne accorgi anche da una nota presente nella documentazione Rails:

link_to(name, options = {}, html_options = nil)
link_to(options = {}, html_options = nil) do
# name
end

Ciao,
Silvano

2009/3/27 Alessandro A. [email protected]:

Probabilmente la mia scarsissima dimistichezza con i path (o simili) mi
Alessandro

Posted via http://www.ruby-forum.com/.


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Considera l’ambiente prima di stampare questa email. Dai, che
l’equazione è semplice: meno A4, più alberi.

. . . Silvano S. . . .
email: [email protected]
site: http://www.sistrall.it

Silvano S. wrote:

Ciao Alessandro,
ciao a tutti,

se ho capito bene il tuo primo messaggio, il problema sta nel modo in
cui passi gli argomenti a link_to: quando usi un block, gli argomenti
di link_to devono scalare di posto. Il tuo codice dovrebbe diventare:

<% link_to(:controller => “messages”,:action => “inbox”) do %>
[contenuto del blocco, scritto come l’avevi scritto tu o ripensato
come suggerito da Andrea]
<% end %>

Te ne accorgi anche da una nota presente nella documentazione Rails:

link_to(name, options = {}, html_options = nil)
link_to(options = {}, html_options = nil) do
# name
end

giusto… pensa che l’avevo pure letto, ma evidentemente con
disattenzione…

visto ora è cosi’ chiaro che mi sembra assurdo che non ci sia arrivato
da solo senza disturbarvi…

devo smetterla di mettermi a leggere documentazione dopo una certa ora
:wink:

Grazie
Ciao

Ti chiedevo se riesci a valutare il numero di messaggi perché puoi, in
alternativa al link_to, utilizzare il codice esplicito che ti permette,
almeno a mio parere di avere il massimo controllo.
Tu desideri un link del tipo:

Message
(2)

se nel routes hai:
map.messages ‘/messages/inbox’, :controller => “messages”,:action =>
“inbox”

nella view io utilizzerei:

Message <%=current_user.unread_messages.length-%>

Anzi per aggiungere qualcos’altro di sicuramente utile modificherei
routes per renderlo maggiormente “robot friendly”:
map.messages ‘/messages/inbox/unreaded.html’,
:controller => “messages”,
:action =>“inbox”

Spero di aver compreso bene il tuo problema!

Luigi

Pietro G. wrote:

Il 27 marzo 2009 10.06, Alessandro A. [email protected] ha scritto:

ma con il block non c’era proprio modo (ormai mi � rimasta la curiosit�)

ciao, non sono intervenuto finora perch� non l’ho mai usato ma, per
quanto tutti ti stiano dicendo che link_to col block non c’entra
niente, mi sembrava di ricordare distintamente che in rails 2.2 (o
2.3?) hanno introdotto il block in link_to; ho controllato e qui:

ActionView::Helpers::UrlHelper

si vedono esempi tipo:

<% link_to(@profile) do %>
<%= @profile.name %>Check it out!!
<% end %>

pietro

si l’avevo visto, ed è da li che sono partito.
Probabilmente la mia scarsissima dimistichezza con i path (o simili) mi
ha impedito di farlo funzionare.
Forse visto che è una novità (io sono nuovo, quindi non ci avevo fatto
caso), il blocco con i link non supporta il modo “medievale” che uso io
con action e controller esplicitati.

Non mi resta quindi che aggiornarmi :slight_smile:
(comunque se qualcuno ci riesce me lo fa sapere?)

Ciao, grazie
Alessandro