我得到的错误就是这个,它表示页面中的NoMethodError删除
未定义的方法`id'为零:NilClass 提取的来源(第6行): 4 五 6 7 8 9
<h2>Delete Page</h2>
<%= form_for(:page, :url =>{:action => 'destroy', :id => @page.id}) do |f| %>
<p>Are you sure you want to permanently delete this page ?</p>
我的delete.html.erb来自网页
<%= link_to("<< Back to List", {:action => 'index'}, :class =>'back-link') %>
<div class="pages delete">
<h2>Delete Page</h2>
<%= form_for(:page, :url =>{:action => 'destroy', :id => @page.id}) do |f| %>
<p>Are you sure you want to permanently delete this page ?</p>
<p class="reference-name"><%= @page.name %></p>
<div class="form-buttons">
<%= submit_tag("Delete Page") %>
</div>
<% end %>
</div>
我的页面控制器
class PagesController < ApplicationController
layout false
def index
@pages = Page.sorted
end
def show
@page = Page.find(params[:id])
end
def new
@page = Page.new({:name => "Default"})
end
def create
@page = Page.new(page_params)
if @page.save
flash[:notice] = "Page created successfully."
redirect_to(:action => 'index')
else
render('new')
end
end
def edit
@page = Page.find(params[:id])
end
def update
@page = Page.find(params[:id])
if @page.update_attributes(page_params)
flash[:notice] = "Page updated successfully."
redirect_to(:action => 'show', :id => @page.id)
else
render('edit')
end
def delete
@page = Page.find(params[:id])
end
def destroy
page = Page.find(params[:id]).destroy
flash[:notice] = "Page destroyed successfully."
redirect_to(:action => 'index')
end
private
def page_params
params.require(:page).permit(:subject_id, :name, :permalink, :position, :visible)
end
end
end
任何帮助将不胜感激,谢谢
答案 0 :(得分:0)
Vitaly Stanchits是对的。控制器动作时:
def delete
@page = Page.find(params[:id])
end
执行 - 它明确地将@page
设置为nil
,这意味着它无法找到具有给定ID的网页。
您可以为我们运行rake routes
,以确认/pages/delete/:id
确实是删除视图的预期路线,并根据结果验证您是否正在访问正确的路径,例如。 /pages/delete/25
如果您确定删除操作中的@page = Page.find(25)
应返回有效的数据库记录,请尝试在删除操作中删除debugger
语句,以确保您点击控制器的正确部分,并检查params[:id]
。
答案 1 :(得分:0)
问题可能在于您的路线(而不是您的控制器)。
这样做:
ax.pcolormesh(x, y, z, cmap=cmap, norm=norm,
edgecolor="face", antialiased=True)
这样您就可以拨打#config/routes.rb
resources :pages do
get :delete #-> url.com/pages/:id/delete
end
的{{1}}路径:
delete
必须注意的是,这超出了&#34;足智多谋的范围。控制器操作,如下所述:http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default
每当您在Rails中创建路由时,它都基于&#34;资源丰富的&#34;原则(我将在一秒钟内解释):
只要您在@page
文件中拨打#app/controllers/pages_controller.rb
class PagesController < ApplicationController
def delete
@page = Page.find params[:id]
end
end
#app/views/pages/delete.html.erb
<%= form_for @page, method: :destroy do |f| %>
<p>Are you sure you want to permanently delete this page ?</p>
<%= f.submit %>
<% end %>
,就会创建上述内容。这为您提供了一组路径,您可以使用这些路径对对象执行大多数操作:
resources :x
以上指向config/routes.rb
操作(表单指向的操作),允许您安全地删除相关对象。
-
这一点很重要的原因是我看到很多人 - 学习Rails - 他们用超出范围的动作填充他们的控制器。例如:
<%= link_to "Delete Page", @page, method: :destroy, data: { confirm: "Are you sure?" } %>
没有错误,除了它违反了保留您的应用程序object orientated的惯例。在OOP(Ruby构建于其上)中,对象具有先例。
上述控制器首先放置flow;对Rails不好应该完成的方式是通过 show 操作调用destroy
。
因此,对于您的情况,您必须记住,如果您要调用#app/controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController
def home
end
def contact
end
end
操作,则需要确保它在您的应用范围内...
你可以执行以下操作:
@static_page