37 votes

Formulaire distant Rails 3 : Comment spécifier le type de contenu ?

J'utilise Rails 3.2, j'ai un formulaire et je veux qu'il soit envoyé par ajax et que le contrôleur renvoie du json.

J'utilise une aide form_for comme suit :

= form_for(@object, :remote => true, :format => :json) do |f|
....

La méthode de création de mon contrôleur d'objets ressemble à ceci :

  def create
    respond_to do |format|
      if @object.save
         format.html { redirect_to @object }
         format.json { render json: @object, status: :created, location: @object }
      else
        format.html { render action: "new" }
        format.json { render json: @object.errors, status: :unprocessable_entity }
      end
    end
  end

Le formulaire se soumet par ajax comme prévu. Mais le contrôleur renvoie du html, pas du json !

J'inspecte la demande avec firebug et je constate que l'en-tête Content-Type http de la demande ajax est défini comme application/html.

La documentation à ce sujet est plutôt rare, :format => :json semble juste ajouter ".json" à l'action du formulaire, sans modifier les en-têtes http.

J'ai également essayé :content_type => :json, sans résultat.

Je ne peux pas simplement coder en dur le contrôleur pour qu'il renvoie du json, car il y a d'autres endroits où je veux qu'il renvoie du html...

Quelqu'un sait-il comment dire au contrôleur de rendre le json lorsqu'il utilise form_for ?

Merci pour toute aide

0 votes

Quelle url et quelle méthode sont rendues dans votre balise de formulaire sur la page ?

0 votes

Post, la balise complète est : <form method="post" id="new_object" data-remote="true" class="new_object" action="/objects" accept-charset="UTF-8">

0 votes

Pas de json ici. Avez-vous envisagé d'utiliser request.xhr ? pour distinguer les requêtes ajax et normales au lieu du format demandé ?

53voto

spas Points 1262

Vous pouvez définir le type de contenu avec :

\= form\_for(@object, :remote => true, :html => {:'data-type' => 'json'})

Comme décrit dans rails.js ligne 106.

0 votes

Merci ! Je savais que je manquais quelque chose d'évident ! :)

18 votes

Dans Rails 4, vous pouvez utiliser format: :json (o :format => :json ) au lieu de :html => {:'data-type' => 'json'}

0 votes

@JamesMcMahon Dans Rails 3.2 non plus.

7voto

Brian C Points 71

Pour Rails 5, la bonne méthode consiste à définir un attribut de données data: { type: :json } .

Documents sur JQuery UJS

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X