未定义的方法' id' for nil:NilClass Ruby on Rails必备培训

时间:2015-11-05 13:19:46

标签: ruby-on-rails ruby

我得到的错误就是这个,它表示页面中的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

任何帮助将不胜感激,谢谢

2 个答案:

答案 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;原则(我将在一秒钟内解释):

enter image description here

只要您在@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