この投稿と非常によく似た問題があります (まったく同じかどうかはわかりません)。
編集メソッドは、既存のレコードを更新するだけでなく、新しいレコードを作成しています
^^お気づきかもしれませんが、解決策は投稿されていません。
建物のネットワーク用にマップをセットアップしました。フロア=>スイッチ、スイッチ=>ジャックとして設定されています。それぞれが一度だけネストされます。
問題は、スイッチの編集/更新方法にあります。スイッチの編集ボタンをクリックすると、正しい URL (.../switch/1/edit) にリダイレクトされますが、すぐにフォームが間違っていることに気付きます。「スイッチの更新」というボタンの代わりに、「スイッチの作成」と表示され、まさにそれが起こります。更新したかったスイッチが更新されるのではなく、新しいスイッチが作成されます。
関連するコードは次のとおりです。他のものを見たい場合は、お知らせください。
...アプリ/ビュー/スイッチ/_form.html.erb:
<%= form_for([@floor, @switch]) do |f| %>
<% if @switch.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@switch.errors.count, "error") %> prohibited this switch from being saved:</h2>
<ul>
<% @switch.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
...app/controllers/switches_controller.rb:
class SwitchesController < ApplicationController
def create
@floor = Floor.find(params[:floor_id])
@switch = @floor.switches.create(params[:switch])
redirect_to(@floor)
end
def destroy
@floor = Floor.find(params[:floor_id])
@switch = @floor.switches.find(params[:id])
@switch.destroy
redirect_to(@floor)
end
def show
@floor = Floor.find(params[:floor_id])
@switch = @floor.switches.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render :json => @switch }
end
end
def edit
@floor = Floor.find(params[:floor_id])
@switch = @floor.switches.find(params[:id])
end
def update
@floor = Floor.find(params[:id])
@switch = @floor.switches.find(params[:id])
respond_to do |format|
if @switch.update_attributes(params[:switch])
format.html { redirect_to @switch, :notice => 'Floor was successfully updated.' }
format.json { head :no_content }
else
format.html { render :action => "edit" }
format.json { render :json => @switch.errors, :status => :unprocessable_entity }
end
end
end
end
update ではなく create メソッドを使用する理由を理解できる人はいますか? ありがとう!