Spiegazione dei parametri di Rails?


228

Qualcuno potrebbe spiegare paramsnel controller di Rails: da dove provengono e a cosa si riferiscono?

  def create
    @vote = Vote.new(params[:vote])
    item = params[:vote][:item_id]
    uid = params[:vote][:user_id]
    @extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])
    last_vote_time = @extant.created_at unless @extant.blank?
    curr_time = Time.now
  end

Vorrei poter leggere questo codice riga per riga e capire cosa sta succedendo.


2
Qual è il tuo background sullo sviluppo web lato server? Quali tecnologie conosci già?
Maurício Linhares,

3
Sono stato con HTML e CSS per anni. Classi prese che utilizzavano PHP, JS e Java. Ho usato pochissimo MVC con php. Ho davvero imparato a programmare usando Java. E comprendo a fondo la teoria dei database.
Dru,

Risposte:


281

I parametri provengono dal browser dell'utente quando richiedono la pagina. Per una richiesta GET HTTP, che è la più comune, i parametri sono codificati nell'URL. Ad esempio, se richiesto da un browser dell'utente

http://www.example.com/?foo=1&boo=octopus

allora params[:foo]sarebbe "1" e params[:boo]sarebbe "polpo".

In HTTP / HTML, i parametri sono in realtà solo una serie di coppie chiave-valore in cui la chiave e il valore sono stringhe, ma Ruby on Rails ha una sintassi speciale per rendere i parametri un hash con hash all'interno. Ad esempio, se richiesto dal browser dell'utente

http://www.example.com/?vote[item_id]=1&vote[user_id]=2

allora params[:vote]sarebbe un hash, params[:vote][:item_id]sarebbe "1" e params[:vote][:user_id]sarebbe "2".

I parametri di Ruby on Rails sono l'equivalente dell'array $ _REQUEST in PHP .


13
Equivalente a $ _REQUEST, tranne per il fatto che $ _REQUEST include i dati get, post e cookie, mentre i parametri ottengono e postano solo dati.
Parziphal,

3
I dati POST di @renocor sono inclusi anche paramsnell'hash di Rails . I dati sui cookie sono inclusi sessionnell'hash.
Richard Jones,

Questa risposta lascia fuori un'altra fonte di parametri: l'URL. Vedi la risposta di Hammar per ulteriori informazioni.
Richard Jones,

1
toasterlovin, sembra che tu non abbia letto la seconda frase della mia risposta o guardi il primo esempio.
David Grayson,

1
@AnkitDhingra ... Penso che sarà sempre una stringa dato che i parametri HTTP sono in realtà solo una coppia chiave / valore e Rails (molto probabilmente Rack gem) lo analizza in hash e array in base al valore chiave, ma non ho visto nulla del genere che dice a Rails che il valore è un numero.
rubyprince,

75

Come altri hanno sottolineato, i paramsvalori possono provenire dalla stringa di query di una richiesta GET o dai dati del modulo di una richiesta POST, ma c'è anche un terzo posto da cui possono provenire: il percorso dell'URL.

Come forse saprai, Rails utilizza qualcosa chiamato route per indirizzare le richieste alle azioni del controller corrispondenti. Queste rotte possono contenere segmenti estratti dall'URL e inseriti params. Ad esempio, se hai un percorso come questo:

match 'products/:id', ...

Poi una richiesta a un URL del tipo http://example.com/products/42imposterà params[:id]a 42.


Come si ottiene un secondo parametro? come / squad / id / member / id / stuff
weteamsteve

48

Params contiene i seguenti tre gruppi di parametri:

  1. Parametri forniti dall'utente
    • OTTIENI (http://domain.com/url?param1=value1¶m2=value2 imposterà params [: param1] e params [: param2])
    • POST (ad es. JSON, XML verranno automaticamente analizzati e archiviati in parametri)
    • Nota: per impostazione predefinita, Rails duplica i parametri forniti dall'utente e li memorizza in parametri [: utente] se in UsersController, può essere modificato con l'impostazione wrap_parameters
  2. Parametri di routing
    • match '/user/:id' in route.rb imposterà i parametri [: id]
  3. Parametri di default
    • params[:controller]ed params[:action]è sempre disponibile e contiene il controller e l'azione correnti

1
Potresti espandere la tua nota sotto User supplied parametersun po 'di più? Ad esempio, un esempio dell'hash dei parametri in UsersController sarebbe utile. Il tuo esempio fa sembrare che l'hash assomiglierà a qualcosa del genere: {first_name: "mike", user: {first_name: "mike"} ...} è corretto?
7

1
Non lo vedo in Rails4. Per esempio, {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"}. Perdonami se sbaglio, sono un principiante di rotaie. Secondo la tua nota, dovrei vedere: {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} non so se ciò abbia a che fare con parametri forti in rails4 o no.
7stud

2
Sto vedendo i parametri duplicati in Rails 4, ma solo nelle richieste POST json (usando Angularjs) non nei post HTML di Rails. Questo link spiega perché: stackoverflow.com/questions/10774972/…
Homan

13

Fondamentalmente, i parametri sono dati specificati dall'utente per l'applicazione rotaie.

Quando pubblichi un modulo, lo fai generalmente con una richiesta POST invece della richiesta GET. Puoi considerare le normali richieste di rotaie come richieste GET, quando navighi nel sito, se aiuta.

Quando si invia un modulo, il controllo viene restituito all'applicazione. Come si ottengono i valori inviati al modulo? paramsè come.

Informazioni sul tuo codice. @vote = Vote.new params[:vote]crea un nuovo voto nel database usando i dati dei parametri [: voto]. Dato che il tuo modulo utente inviato è stato nominato sotto il nome: voto, tutti i suoi dati sono in questo: voto campo dell'hash.

Le due righe successive vengono utilizzate per ottenere l'articolo e l'utente ha inviato il modulo.

@extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])

trova il voto più recente o inserito per ultimo dal database con condizioni item_id = item e user_id = uid.

Le righe successive richiedono l'ora dell'ultimo voto e l'ora corrente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.