2010-09-09 21 views
1

J'ai un _form.html.erb partielle qui vient du modèle de rails standard 3 pour le projet de modèle.rails format ajax demandé a la mauvaise méthode

#view: 
    <div id="content"> 
     <%= link_to 'Edit', edit_project_path(@project), :remote => :true %> 
    </div> 

    #projects controllers 
    def edit 
     @project = Project.find(params[:id]) 

     respond_to do |format| 
      format.html # edit.html.erb 
      format.js { render "form.js.rjs" } 
     end 
     end 

    #form.js.rjs 
    page.replace_html "content", :partial => 'form' 

    #_form.html.erb 
    <%= form_for(@project) do |f| %> 
     <% if @project.errors.any? %> 
     <div id="error_explanation"> 
      <h2><%= pluralize(@project.errors.count, "error") %> prohibited this project from being saved:</h2> 

      <ul> 
      <% @project.errors.full_messages.each do |msg| %> 
      <li><%= msg %></li> 
      <% end %> 
      </ul> 
     </div> 
     <% end %> 
     <p> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 
     </p> 

     <div class="actions"> 
     <%= f.submit %> 
     </div> 
    <% end %> 

Alors que je clique sur ce lien pour modifier un projet, le formulaire ne vient à travers à travers ajax, mais la méthode du formulaire est maintenant afficher au lieu de vente. ce qui signifie que, comme je le soumets, il va créer de nouveaux projets avec les mêmes attributs que l'existant que je suis en train de modifier b/c de la méthode de création qui est appelée lors de la réception d'une demande de publication. Je sais que form_for (@project) compte sur l'ID d'enregistrement pour dire si c'est nouveau ou non, j'ai regardé toutes les sources pour form_for, form_tag, extras_tags_for_form, form_tag_html mais ne trouve pas d'endroit où ils spécifient quelle méthode pour le La balise de forme doit être utilisée. L'endroit le plus proche où il définit la méthode est dans extra_tags_for_form, mais dans cette méthode, il passe simplement à travers le hash d'option de méthode qui lui est déjà passé, mais d'où est-ce: l'option de méthode est passée? Je ne peux pas trouver.

des idées?

Répondre

0

Vous êtes sur la bonne voie, form_form (obj) regardera le drapeau sale des objets pour savoir quoi en faire. Cela ne veut pas dire que vous ne pouvez pas lui dire quoi faire quand même :)

Form_for possède en réalité quelques hachages dans ses paramètres optionnels: méthode vit à l'intérieur: html. donc pour le forcer à être mis, il suffit de faire quelque chose comme ça

form_for @project, :html => {:method => :put} do |f|