1

我有一个来自模型项目的标准 rails 3 模板的 _form.html.erb 部分。

    #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。这意味着当我提交时,它将创建具有与我正在编辑的现有项目相同属性的新项目,该方法是在收到发布请求时调用的 create 方法的。

我知道 form_for(@project) 依靠记录 id 来判断它是否是新的,我查看了 form_for、form_tag、extras_tags_for_form、form_tag_html 的所有来源,但找不到他们指定表单标签的方法的地方使用。它定义方法的最近位置是在 extra_tags_for_form 中,但在那个方法中,它只是筛选已经传递给它的 :method 选项哈希,但是这个 :method 选项是从哪里传递的?我找不到。

有任何想法吗?

4

1 回答 1

0

您在正确的轨道上,form_form(obj) 将查看对象的脏标志以找出如何处理它。这并不意味着你不能告诉它该做什么:)

form_for 实际上在其可选参数中有一些哈希值,:method 位于 :html 中。所以要强制它被放置,只需做这样的事情

form_for @project, :html => {:method => :put} do |f|
于 2010-09-09T12:49:51.473 回答