Link_to con il blocco


#1

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


#2

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


#3

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


#4

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!


#5

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


#6

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


#7

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

Luigi


#8

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 “#{…}” …


#9

Il 27 marzo 2009 10.06, Alessandro A. removed_email_address@domain.invalid 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


#10

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


#11

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. removed_email_address@domain.invalid:

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

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


Ml mailing list
removed_email_address@domain.invalid
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: removed_email_address@domain.invalid
site: http://www.sistrall.it


#12

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


#13

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


#14

Pietro G. wrote:

Il 27 marzo 2009 10.06, Alessandro A. removed_email_address@domain.invalid 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

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