Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di deleted_id_48586
    Registrato dal
    Nov 2002
    Messaggi
    1,732

    [Rails] to_param e URL optimization

    Ciao,

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

    Es:

    codice:
    /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.

  2. #2
    book_path non lo devi toccare.
    to_param è un metodo d'istanza di un oggetto active record.

    Presupponendo che tu abbia un modello Book.

    codice:
    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

    codice:
    class Book < ActiveRecord::Base
    
      def to_param
        id.nil? super : "#{id}-#{title.to_s.parameterize}"
      end
    
    end

  3. #3
    Utente di HTML.it L'avatar di deleted_id_48586
    Registrato dal
    Nov 2002
    Messaggi
    1,732
    In primis grazie per la risposta.

    Tuttavia ottengo questo errore:

    codice:
     unexpected ':', expecting kEND
    id.nil? super : "#{id}-#{title.to_s.parameterize}"
    Se, inoltre, volessi fare un route simile:

    codice:
    libri/1/titolo-del-libro
    anzichè:
    codice:
    libri/1-titolo-del-libro
    ?

  4. #4
    Un minimo di sforzo nel debugging potresti anche metterlo.

    Comunque, manca un ?

    codice:
    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

    codice:
    Book.find("3-il-libro")
    è come dire

    codice:
    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.

  5. #5
    Utente di HTML.it L'avatar di deleted_id_48586
    Registrato dal
    Nov 2002
    Messaggi
    1,732
    edit

  6. #6
    Utente di HTML.it L'avatar di deleted_id_48586
    Registrato dal
    Nov 2002
    Messaggi
    1,732
    Mi sono guardato meglio la documentazione relativa alle "resoruces".

    Ora in routes.rb ho:

    codice:
    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

    codice:
    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è.

  7. #7
    Utente di HTML.it L'avatar di deleted_id_48586
    Registrato dal
    Nov 2002
    Messaggi
    1,732
    Ok, sbagliavo io, ovviamente.

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

  8. #8
    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)

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

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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.