モデル プロジェクトの標準的な 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 オプションはどこから渡されたのでしょうか? をみつけられない。
何か案は?