PDA

Visualizza la versione completa : [Rails] to_param e URL optimization


Sgurbat
24-02-2010, 16:41
Ciao,

volevo capire qual' il modo migliore per costruire e leggere gli URL di una risorsa.

Es:


/libri/1/titolo-del-libro

Utilizzando il metodo book_path() come devo modificare il metodo to_param per costruire il titolo in automatico in fondo all'URL?

Ho guardato un p in rete ma non mi del tutto chiaro.

Grazie.

weppos
27-02-2010, 11:56
book_path non lo devi toccare.
to_param un metodo d'istanza di un oggetto active record.

Presupponendo che tu abbia un modello Book.



class Book < ActiveRecord::Base

def to_param
id.nil? super : "#{id}-quello-che-vuoi"
end

end


Se il modello book ha un titolo, allora puoi fare



class Book < ActiveRecord::Base

def to_param
id.nil? super : "#{id}-#{title.to_s.parameterize}"
end

end

Sgurbat
27-02-2010, 12:06
In primis grazie per la risposta.

Tuttavia ottengo questo errore:


unexpected ':', expecting kEND
id.nil? super : "#{id}-#{title.to_s.parameterize}"


Se, inoltre, volessi fare un route simile:


libri/1/titolo-del-libro

anzich:

libri/1-titolo-del-libro?

weppos
27-02-2010, 12:11
Un minimo di sforzo nel debugging potresti anche metterlo. ;)

Comunque, manca un ?


id.nil? ? super : "#{id}-#{title.to_s.parameterize}"

Riguardo all'altra domanda, lo puoi fare ma pi complicato e richiede che tu conosca pi approfonditamente Ruby e Rails.
Il vantaggio di questa soluzione che completamente unobtrusive. Tu la puoi attivare o disattivare e non devi cambiare una virgola, n nelle chiamate a find n nel routing.

Infatti usare


Book.find("3-il-libro")

come dire


Book.find(3)

Per attuare la soluzione che dici tu devi cambiare le regole di routing al fine di accettare 2 parametri, l':id ed un generico :slug.
Il problema, tra l'altro, che Rails non supporta questa sintassi per i routing tramite resources, quindi dovresti mapparti a mano tutte le URL.

In sintesi... non ti conviene.

Sgurbat
27-02-2010, 12:12
edit

Sgurbat
27-02-2010, 12:54
Mi sono guardato meglio la documentazione relativa alle "resoruces".

Ora in routes.rb ho:


map.resources :books, :as => 'libri', :controller => 'public/books'

Il controller books ha un namespace "public" perch ho suddiviso il blog in due aree "admin" e "public"

Nella view ho quindi ora


book_path(book.id)

e ho modificato to_param come indicato.

Tuttavia, per non avendo alcun errore, l'URL generato dall'helper book_path non contempla anche il "title".

Sto cercando di capire perch.

Sgurbat
27-02-2010, 13:10
Ok, sbagliavo io, ovviamente.

in book_path() dovevo passare tutto l'oggetto book e non solo book.id ;)

weppos
27-02-2010, 13:14
Originariamente inviato da Sgurbat
Ok, sbagliavo io, ovviamente.

in book_path() dovevo passare tutto l'oggetto book e non solo book.id ;)

Esatto. Considera che in una regola di routing non devi *mai* passare l'ID, salvo se non espressamente richiesto.
Questo vale anche nei test, ad esempio mai scrivere (come era in uso in Rails 1.2 e troverai in vecchi tutorial)


def test_show
get :show, :id => @book.id
end

Ma sempre


def test_show
get :show, :id => @book.to_param
end

Loading