Quel est le moyen le plus simple d'identifier et de séparer les paramètres GET et POST d'un contrôleur sous Ruby on Rails, équivalent aux variables $ _GET et $ _POST sous PHP?
Pour cela, je ne connais aucune méthode pratique dans Rails, mais vous pouvez accéder directement à la chaîne de requête pour analyser les paramètres définis ici. Quelque chose comme ce qui suit:
request.query_string.split(/&/).inject({}) do |hash, setting|
key, val = setting.split(/=/)
hash[key.to_sym] = val
hash
end
Vous pouvez utiliser les méthodes request.get?
et request.post?
pour faire la distinction entre HTTP Gets et Posts.
Vous pouvez le faire en utilisant:
request.POST
et
request.GET
Il existe trois accesseurs de hachage très légèrement documentés sur l'objet de requête pour cela:
request.query_parameters
- envoyé dans la chaîne de requête, c'est-à-dire après un?request.path_parameters
- décodé à partir de l'URL via le routage, c'est-à-dire le contrôleur, l'action, l'identifiantrequest.request_parameters
- Tous les paramètres, y compris ceux mentionnés ci-dessus ainsi que ceux envoyés dans le corps du corps POSTVous pouvez utiliser Hash#reject
pour accéder aux paramètres POST-only uniquement.
Source: http://guides.rubyonrails.org/v2.3.8/action_controller_overview.html section 9.1.1
J'ai regardé dans une ancienne application Rails 1.2.6 et ces accesseurs existaient aussi à l'époque.
Si vous souhaitez vérifier le type de demande afin d'empêcher quoi que ce soit d'utiliser la mauvaise méthode, sachez que vous pouvez également le spécifier dans votre fichier routes.rb:
map.connect '/posts/:post_id', :controller => 'posts', :action => 'update', :conditions => {:method => :post}
ou
map.resources :posts, :conditions => {:method => :post}
La méthode de mise à jour de votre PostsController ne sera désormais appelée que lorsque vous avez effectivement publié un message. Consultez le doc pour ressources .
Il existe une différence entre les paramètres GET et POST. Une requête HTTP POST peut toujours avoir des paramètres GET.
Les paramètres GET sont des paramètres de requête d'URL.
Les paramètres POST sont des paramètres dans le corps de la requête HTTP.
vous pouvez y accéder séparément des hachages request.GET et request.POST.
request.get?
retournera boolean true s'il s'agit de la méthode GET,
request.post?
retournera boolean true s'il s'agit de la méthode POST,
Vous n'avez pas besoin de connaître ce niveau de détail dans le contrôleur. Vos itinéraires et vos formulaires entraîneront l'ajout d'éléments appropriés au hachage params. Ensuite, dans le contrôleur, vous devez simplement accéder à params[:foo]
pour obtenir le paramètre foo et faire tout ce dont vous avez besoin.
Le mappage entre GET et POST (et PUT et DELETE) et les actions du contrôleur est défini dans config/routes.rb
dans le code Rails le plus moderne.
Je pense que ce que tu veux faire n'est pas très "Rails", si tu vois ce que je veux dire. Vos demandes GET doivent être idempotentes - vous devriez pouvoir émettre plusieurs fois la même demande GET et obtenir le même résultat à chaque fois.
Je pense que Jesse Reiss parle d’une situation dans laquelle vous avez dans votre fichier routes.rb
post 'ctrllr/:a/:b' => 'ctrllr#an_action'
et vous POST sur "/ ctrllr/foo/bar? a = not_foo" POST valeurs {'a' => 'still_not_foo'}, vous aurez trois valeurs différentes valeurs de 'a': 'foo', 'not_foo' et 'still_not_foo'
"params" dans le contrôleur aura "a" réglé sur "foo". Pour trouver 'a' défini sur 'not_foo' et 'still_not_foo', vous devez examiner request.GET
et request.POST
J'ai écrit une gemme qui fait la distinction entre ces différentes paires clé => valeur à l'adresse https://github.com/pdxrod/routesfordummies .
if request.query_parameters().to_a.empty?