Ruby on rails rails ajax请求的表单具有错误的方法

Ruby on rails rails ajax请求的表单具有错误的方法,ruby-on-rails,ajax,form-for,Ruby On Rails,Ajax,Form For,我有一个_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.f

我有一个_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 %>
#查看:
:真%>
#项目控制器
定义编辑
@project=project.find(参数[:id])
回应待办事项|格式|
format.html#edit.html.erb
format.js{render“form.js.rjs”}
结束
结束
#form.js.rjs
page.replace_html“content”,:partial=>“form”
#_form.html.erb
禁止保存此项目:

当我单击该链接编辑项目时,表单确实是通过ajax实现的,但是表单的方法现在是post而不是put。这意味着当我提交时,它将创建新项目,其属性与我正在编辑的现有项目相同,创建方法的b/c在收到post请求时被调用

我知道(@project)的form_依赖于记录id来判断它是否是新的,我查看了form_for、form_tag、extras_tags_for_form、form_tag_html的所有源代码,但找不到它们指定使用form tag的方法的位置。它定义方法的最近位置是在额外的\u标记\u for\u表单中,但在该方法中,它只是筛选已经传递给它的:method选项散列,但是:method选项从何处传递?我找不到


有什么想法吗?

你的思路是对的,form_form(obj)将查看对象脏标志,以确定如何处理它。但这并不意味着你不能告诉它该做什么:)

form_for的可选参数中实际上有一些散列,:method存在于:html中。所以,要强迫它被放置,只需这样做

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