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