0

この投稿と非常によく似た問題があります (まったく同じかどうかはわかりません)。

編集メソッドは、既存のレコードを更新するだけでなく、新しいレコードを作成しています

^^お気づきかもしれませんが、解決策は投稿されていません。

建物のネットワーク用にマップをセットアップしました。フロア=>スイッチ、スイッチ=>ジャックとして設定されています。それぞれが一度だけネストされます。

問題は、スイッチの編集/更新方法にあります。スイッチの編集ボタンをクリックすると、正しい 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 メソッドを使用する理由を理解できる人はいますか? ありがとう!

4

1 に答える 1

0

エラーはここにあります。フォームは常に新しいスイッチ用に作成されます

<%= form_for([@floor, @floor.switches.build]) do |f| %>
  <% @switch = @floor.switches.find(params[:id]) %>

に変更します

<%= form_for([@floor, @switch]) do |f| %>

(そして行を削除します)

<% @switch = @floor.switches.find(params[:id]) %>

newコントローラーにアクションが表示されません。次のようになります

def new
  @floor = Floor.find(params[:floor_id])
  @switch = @floor.switches.build
end
于 2012-06-19T19:37:25.760 に答える