web-dev-qa-db-fra.com

Passer un tableau de paramètres à travers get in rails

Comment passer un tableau de paramètres via la méthode Get in rails? Actuellement, mes URL ressemblent à ceci:

http://localhost:3000/jobs/1017/editing_job_suites/1017/editing_member_jobs/new?ids[]=1025&ids[]=1027

Comment puis-je passer le tableau avec la méthode Get mais éviter la partie ?ids[]=1025&ids[]=1027.

La demande est envoyée avec la méthode javascript window.open. Existe-t-il une solution de contournement permettant d’envoyer une demande Post non ajax.

35
Rafael Sedrakyan

Non, GET ne peut que mettre des variables sur l’URL elle-même. Si vous voulez que l'URL soit plus courte, vous devez POST. C'est un limitation fonctionnalité de HTTP, pas Rails.

25
DGM

Vous devez vous en tenir à l'utilisation d'une requête GET si vous ne modifiez pas l'état de quoi que ce soit et si vous souhaitez accéder à une valeur en lecture seule.

Pour envoyer un tableau d'identifiants à Rails dans une requête GET, il vous suffit de nommer votre variable avec des crochets à la fin. 

//angular snippet

$http.(method:'GET',
  ...
  params: {'channel_id':2, 'product_ids[]': productIds}  
  //where productIds is an array of integers
  ...
)

Ne concaténez pas vos identifiants en une liste séparée par des virgules, mais transmettez-les individuellement de manière redondante. Donc, dans l'URL, cela ressemblerait à quelque chose comme ça:

?channel_id=2&product_ids[]=6900&product_ids[]=6901

url encoded ce sera en fait plus comme ceci:

?channel_id=2&product_ids%5B%5D=6900&product_ids%5B%5D=6901

Les rails sépareront ce retour pour vous.

Parameters: {"channel_id"=>"2", "product_ids"=>["6900", "6901"]}
93
Homan

Récemment, je voulais faire cela et j'ai trouvé une solution de contournement un peu moins complexe, avec quelques limitations de complexité mais pouvant être plus facile à implémenter. Je ne peux pas parler à la sécurité, etc. 

Si vous transmettez vos valeurs de tableau sous forme de chaîne avec un délimiteur, par exemple,.

http://example.com/controller?job_ids=2342,2354,25245

Ensuite, vous pouvez prendre le résultat et le ré-analyser à votre guise:

job_ids = params[:job_ids].split(',')

Alors fais n'importe quoi:

    job_ids.each do |job_id|
      job = Job.find(job_id.to_i)
    end

etc

8
Jason Preston

@Homan answer est valable pour l’utilisation d’un client externe (par exemple curl ou angulaire). Dans les cas de test Inside Rails, vous ne devez cependant pas utiliser []. Voici un exemple:

get get_test_cases_url(**path_params), params: {case_ids: ["NON-9450", "NON-12345", "NON-9361"]}

Ceci utilise un nouveau format où get_test_cases est le nom de route et vous transmettez à la méthode tous les paramètres nécessaires pour construire le chemin de l'URL. Les paramètres de requête sont un hachage séparé.

Pour votre information si j'utilise [] comme case_ids[], alors au lieu de ["NON-9450", "NON-12345", "NON-9361"] je le fais analyser en [["NON-9450"], ["NON-12345"], ["NON-9361"]]

0
akostadinov