Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [Rails] URI => key/value pairs

    Ciao a tutti,

    avrei bisogno di aiuto per capire il metodo più comodo per ricavare da un URL simile:

    es: "products/categoria/5/marca/8"

    una serie di coppie chiave/valore categoria=5 & marca=8

    che si avrebbero con la classica sintassi ?categoria=5&marca=8

    Seguendo The Rails Way di O. Fernandez ho visto che è possibile, all'interno del Controller, sfruttare la Classe "Hash" per questo fine in concomitanza con il route "globbing".

    Es:
    codice:
    map.connect 'products/*val', :controller => 'products', :action => 'index'
    e
    codice:
    @values = Hash[params[:val]]
    tuttavia quando tento la visualizazione mi ritrovo con l'errore

    "odd number of arguments for Hash"

    e poi:
    codice:
    Request
    Parameters:
    {"val"=>["categoria",
     "5"]}
    Riferimento: http://www.informit.com/articles/art...7656&seqNum=16

    Ho provato anche a controllare la lunghezza con params[:val].length e ottengo giustamente 2 come risultato, quindi non capisco perchè mi dica "odd number of arguments for Hash".

    Grazie.

  2. #2
    params è già un hash e se la regola di routing è impostata nel modo corretto conterrà (tra gli altri valori) anche due chiavi corrispondenti ai parametri passati nell'url.
    Per richiamarli è sufficiente accederci attraverso la chiave.

    codice:
    params[:categoria] # => 5
    params[:marca] # => 8
    o più probabilmente, dato che si lavora con campi id

    codice:
    params[:categoria_id] # => 5
    params[:marca_id] # => 8

  3. #3
    Si Params è un hash ma non il singolo valore di parmas[:val] che invece è un array.

    Tant'è che con il route globbing passo il resto dell'URL che mi interessa mappare come coppie chiave/valore tramite la sintassi "products/*val". Che appunto mappa tutto in un array.

    Comunque ho scoperto che così funziona:

    codice:
    @values = Hash[*params[:val]]
    
    * in pratica credo "espanda" l'array prima di passarlo ad Hash[]
    ed infatti poi mi ritrovo le coppie chiave/valore impostate correttamente.

    credo invece che sia giusto che l'accesso diretto a:
    codice:
    params[:categoria]
    params[:marca]
    NON funzioni perchè Rails non può sapere riconoscere a priori questa struttura: "/chiave/valore"

    Strano infatti infine che nell'esempio che ho indicato
    http://www.informit.com/articles/art...7656&seqNum=16

    manchi "*" prima di params all'interno di Hash[].


  4. #4
    Originariamente inviato da CozzaAmara
    NON funzioni perchè Rails non può sapere riconoscere a priori questa struttura: "/chiave/valore"
    Certo che funziona, se usi Rails nel modo corretto.
    Confesso che non ho capito nulla di quello che stai cercando di fare, solo solo che in un ipotetico URL

    localhost:3000/product/23/comment/45

    dove product e comment sono due modelli correttamente impostati nel file di route, avrai che

    params[roduct_id] = 23
    params[:id] = 45

    Provare per credere. Crea un modello con uno scaffold e lo vedrai tu stesso.

  5. #5
    Aggiungo che, leggendo il tutorial, vedo la riga

    codice:
    map.connect 'items/*specs', :controller => "items", :action => "specify"
    Auspico che lo faccia fare solo per esercizio. Impostare una regola di routing che accetta illimitati parametri per poi doverli associare ad un Hash è assurdo quando hai un framework che lo fa apposta.
    Normalmente questo comportamento si adotta solo quando ci sono specifiche esigenze per le quali non si conosce in anticipo la lunghezza del parametro. Ad esempio, se devi creare un controller per il browsing di un filesystem.

  6. #6
    Originariamente inviato da weppos
    Aggiungo che, leggendo il tutorial, vedo la riga

    codice:
    map.connect 'items/*specs', :controller => "items", :action => "specify"
    Auspico che lo faccia fare solo per esercizio. Impostare una regola di routing che accetta illimitati parametri per poi doverli associare ad un Hash è assurdo quando hai un framework che lo fa apposta.
    Normalmente questo comportamento si adotta solo quando ci sono specifiche esigenze per le quali non si conosce in anticipo la lunghezza del parametro. Ad esempio, se devi creare un controller per il browsing di un filesystem.
    Si esatto, lo scopo era quello di avere sistema che potesse gestire N paramentri nel formato "/chiave/valore".

    Da qui l'uso di /*specs nel file routes.rb.

    Certo è che si sà a priori lo schema dell'URL allora tanto meglio creare qualcosa, come giustamente indichi, più simile a:

    codice:
    map.connect 'products/categoria/:categoria_id/marca/:marca_id', :controller => 'products', :action => 'index'
    Quando dicevo che "non" funzionava mi riferivo proprio al fatto di non aver impostato una regola di routing come sopra, quindi, giustamente, era impossibile che il framework capisse le mie intenzioni.

    Grazie ancora.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.