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 を介して取得されますが、フォームのメソッドは put ではなく post になりました。つまり、送信すると、投稿リクエストの受信時に呼び出される create メソッドの b/c を編集している既存のプロジェクトと同じ属性を持つ新しいプロジェクトが作成されます。

form_for(@project) が新しいかどうかを判断するためにレコード ID に依存していることはわかっています。利用される。メソッドを定義する最も近い場所は 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 に答える