рельсы ajax запрашиваемая форма имеет неправильный метод - PullRequest
1 голос
/ 09 сентября 2010

У меня есть часть _form.html.erb, полученная из стандартного шаблона rails 3. для модельного проекта.

    #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 %>

Пока я нажимаю эту ссылку, чтобы отредактировать проект, форма проходит черезajax, но метод для формы теперь post, а не put.это означает, что при отправке я буду создавать новые проекты с теми же атрибутами, что и существующий, который я редактирую, b / c метода create, который вызывается при получении запроса на публикацию.

Я знаю, что form_for (@Project) полагаться на идентификатор записи, чтобы сказать, является ли она новой или нет, я просмотрел все источники для form_for, form_tag, extras_tags_for_form, form_tag_html, но не могу найти место, где они указывают, какой метод для тега формы будет использоваться.Ближайшее место, где он определяет метод, находится в extra_tags_for_form, но в этом методе он просто просеивает через хэш опции: method, который ему уже передан, но откуда передается эта опция: method?Я не могу найти.

есть идеи?

1 Ответ

0 голосов
/ 09 сентября 2010

Вы на правильном пути, form_form (obj) посмотрит на флаг загрязненных объектов, чтобы выяснить, что с ним делать. Это не значит, что вы не можете сказать, что делать:)

form_for на самом деле имеет несколько хэшей в своих необязательных параметрах: метод живет внутри: html. так, чтобы заставить это быть помещенным, просто сделайте что-то подобное

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