Les paramètres de Rails expliqués?

228

Quelqu'un pourrait-il expliquer paramsdans le contrôleur Rails: d'où ils viennent et à quoi ils font référence?

  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

Je voudrais pouvoir lire ce code ligne par ligne et comprendre ce qui se passe.

Dru
la source
2
Quelle est votre expérience en développement Web côté serveur? Quelles technologies connaissez-vous déjà?
Maurício Linhares
3
Je travaille avec HTML et CSS depuis des années. Pris des classes qui utilisaient PHP, JS et Java. Utilisé très peu de MVC avec php. J'ai vraiment appris la programmation en utilisant Java. Et je comprends parfaitement la théorie des bases de données.
Dru

Réponses:

281

Les paramètres proviennent du navigateur de l'utilisateur lorsqu'il demande la page. Pour une requête HTTP GET, qui est la plus courante, les paramètres sont encodés dans l'url. Par exemple, si le navigateur d'un utilisateur a demandé

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

alors params[:foo]serait « 1 » et params[:boo]serait « pieuvre ».

En HTTP / HTML, les paramètres ne sont en réalité qu'une série de paires clé-valeur où la clé et la valeur sont des chaînes, mais Ruby on Rails a une syntaxe spéciale pour faire des paramètres un hachage avec des hachages à l'intérieur. Par exemple, si le navigateur de l'utilisateur a demandé

http://www.example.com/?vote[item_id

alors params[:vote]serait un hachage, params[:vote][:item_id]serait « 1 » et params[:vote][:user_id]serait « 2 ».

Les paramètres Ruby on Rails sont l'équivalent du tableau $ _REQUEST en PHP .

David Grayson
la source
13
Équivalent à $ _REQUEST sauf que $ _REQUEST inclut les données get, post et cookie, tandis que les params n'obtiennent et ne postent que les données.
Parziphal
3
Les données @renocor POST sont également incluses dans le paramshachage Rails . Les données des cookies sont incluses dans le sessionhachage.
Richard Jones
Cette réponse laisse de côté une autre source de paramètres: l'URL. Voir la réponse de hammar pour plus d'informations.
Richard Jones
1
toasterlovin, on dirait que vous n'avez pas lu la deuxième phrase de ma réponse ou regardé le premier exemple.
David Grayson
1
@AnkitDhingra ... Je pense que ce sera toujours une chaîne car les paramètres HTTP ne sont en réalité que des paires clé / valeur et Rails (très probablement Rack gem) les analyse en hachages et tableaux selon la valeur de la clé, mais je n'ai rien vu de tel qui indique à Rails que la valeur est un nombre.
rubyprince
75

Comme d'autres l'ont souligné, les paramsvaleurs peuvent provenir de la chaîne de requête d'une demande GET ou des données de formulaire d'une demande POST, mais il y a aussi un troisième endroit d'où elles peuvent provenir: le chemin de l'URL.

Comme vous le savez peut-être, Rails utilise quelque chose appelé routes pour diriger les demandes vers leurs actions de contrôleur correspondantes. Ces itinéraires peuvent contenir des segments extraits de l'URL et placés dans params. Par exemple, si vous avez un itinéraire comme celui-ci:

match 'products/:id', ...

Ensuite, une demande à une URL comme http://example.com/products/42sera définie params[:id]sur 42.

hammar
la source
Comment obtenez-vous un deuxième param? comme / squad / id / member / id / stuff
weteamsteve
48

Params contient les trois groupes de paramètres suivants:

  1. Paramètres fournis par l'utilisateur
    • GET (http://domain.com/url?param1=value1¶m2=value2 définira les paramètres [: param1] et les paramètres [: param2])
    • POST (par exemple JSON, XML sera automatiquement analysé et stocké dans les paramètres)
    • Remarque: Par défaut, Rails duplique les paramètres fournis par l'utilisateur et les stocke dans les paramètres [: utilisateur] si dans UsersController, peut être modifié avec le paramètre wrap_parameters
  2. Paramètres de routage
    • match '/user/:id' dans routes.rb définira les paramètres [: id]
  3. Paramètres par défaut
    • params[:controller]et params[:action]est toujours disponible et contient le contrôleur et l'action actuels
thejaz
la source
1
Pourriez-vous développer votre note sous User supplied parametersun peu plus? Par exemple, un exemple du hachage params dans UsersController serait utile. Votre exemple donne l'impression que le hachage ressemblera à quelque chose: {first_name: "mike", user: {first_name: "mike"} ...} est-ce correct?
7stud
1
Je ne vois pas cela dans rails4. Par exemple, {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"}. Pardonnez-moi si je me trompe, je suis un débutant sur les rails. Selon votre note, je devrais voir: {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} je ne sais pas si cela a à voir avec des paramètres forts dans rails4 ou non.
7stud
2
Je vois les paramètres dupliqués dans Rails 4, mais uniquement sous les requêtes json POST (en utilisant Angularjs) et non sous les propres messages HTML de Rails. Ce lien explique pourquoi: stackoverflow.com/questions/10774972/…
Homan
13

Fondamentalement, les paramètres sont des données spécifiées par l'utilisateur pour l'application rails.

Lorsque vous publiez un formulaire, vous le faites généralement avec une demande POST par opposition à une demande GET. Vous pouvez considérer les demandes de rails normales comme des demandes GET, lorsque vous naviguez sur le site, si cela vous aide.

Lorsque vous soumettez un formulaire, le contrôle est renvoyé à l'application. Comment obtenez-vous les valeurs que vous avez soumises dans le formulaire? paramsc'est comment.

À propos de votre code. @vote = Vote.new params[:vote]crée une nouvelle base de données Vote to en utilisant les données des paramètres [: vote]. Étant donné que l'utilisateur de votre formulaire soumis a été nommé sous le nom: vote, toutes les données de celui-ci se trouvent dans ce champ: vote du hachage.

Les deux lignes suivantes sont utilisées pour obtenir l'élément et l'utilisateur uid a soumis le formulaire.

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

trouve le vote le plus récent ou le dernier inséré dans la base de données avec les conditions item_id = item et user_id = uid.

Les lignes suivantes prennent l'heure du dernier vote et l'heure actuelle.

Smar
la source
6

Du côté Rails, paramsest une méthode qui renvoie un ActionController::Parametersobjet. Voir https://stackoverflow.com/a/44070358/5462485

Margotte
la source
3
+1 pour clarifier que paramsc'est une méthode. Ruby peut rendre difficile la distinction des variables des méthodes
samrap