Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails的编辑/更新方法是创建一个新对象,而不是更新_Ruby On Rails_Ruby On Rails 3_Networking_Network Programming - Fatal编程技术网

Ruby on rails RubyonRails的编辑/更新方法是创建一个新对象,而不是更新

Ruby on rails RubyonRails的编辑/更新方法是创建一个新对象,而不是更新,ruby-on-rails,ruby-on-rails-3,networking,network-programming,Ruby On Rails,Ruby On Rails 3,Networking,Network Programming,我有一个与这篇文章非常相似的问题(不太确定是否完全相同): ^^正如您可能注意到的,没有发布解决方案 我有一张我们大楼网络的地图。它的设置为楼层=>开关,开关=>插孔。每个只嵌套一次 问题出在我的开关编辑/更新方法中。当我单击开关的编辑按钮时,它会将我重定向到正确的url(…/switch/1/edit),但我立即注意到表单不正确。按钮上没有显示“更新开关”,而是显示“创建开关”,这正是发生的情况。将创建一个新开关,而不是更新我要更新的开关 这里是相关代码。如果你想看别的东西,请告诉我 …ap

我有一个与这篇文章非常相似的问题(不太确定是否完全相同):

^^正如您可能注意到的,没有发布解决方案

我有一张我们大楼网络的地图。它的设置为楼层=>开关,开关=>插孔。每个只嵌套一次

问题出在我的开关编辑/更新方法中。当我单击开关的编辑按钮时,它会将我重定向到正确的url(…/switch/1/edit),但我立即注意到表单不正确。按钮上没有显示“更新开关”,而是显示“创建开关”,这正是发生的情况。将创建一个新开关,而不是更新我要更新的开关

这里是相关代码。如果你想看别的东西,请告诉我

…app/views/switches/_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 %>

禁止保存此开关:

…应用程序/控制器/开关\u 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
class SwitchesController@switch}
结束
结束
定义编辑
@地板=地板。查找(参数[:地板id])
@switch=@floor.switches.find(参数[:id])
结束
def更新
@floor=floor.find(参数[:id])
@switch=@floor.switches.find(参数[:id])
回应待办事项|格式|
如果@switch.update_属性(参数[:switch])
format.html{redirect_to@switch,:notice=>“地板已成功更新”。}
format.json{head:no_content}
其他的
format.html{render:action=>“edit”}
format.json{render:json=>@switch.errors,:status=>:unprocessable_entity}
结束
结束
结束
结束

有人能帮我弄清楚为什么它要用create方法而不是update吗?谢谢

错误就在这里,表单总是为新交换机构建的

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

我试过你的第一个建议(换了线,去掉了第二个),现在我甚至看不到地板。NilClass:Class Extracted source的未定义方法“model#u name”(在第#1行附近):1:我也添加了新方法。您可能会在另一个控制器中为新swith呈现表单,因为它以前在没有“new”操作的情况下工作。请检查哪个动作呈现表单,并在那里添加
@switch=@floor.switches.build
。我相信我的动作“show”呈现表单,因为当显示我的错误时,它在跟踪中。你是说我应该在那里尝试它,而不是“@switch=@floor.switches.find(params[:id])”,或者除了它之外?
<%= form_for([@floor, @switch]) do |f| %>
<% @switch = @floor.switches.find(params[:id]) %>
def new
  @floor = Floor.find(params[:floor_id])
  @switch = @floor.switches.build
end