Ruby on rails 收集错误的未定义方法

Ruby on rails 收集错误的未定义方法,ruby-on-rails,class,methods,null,Ruby On Rails,Class,Methods,Null,问候我的程序员们。我有两个问题。1当然是如何解决这个问题。其次,这个错误意味着什么,所以对于我的下一次遭遇,我知道如何处理它 My_form.html.erb <%= error_messages_for(@section) %> <table summary="Section form fields"> <tr> <th><%= f.label(:page_id, "Page ID") %></

问候我的程序员们。我有两个问题。1当然是如何解决这个问题。其次,这个错误意味着什么,所以对于我的下一次遭遇,我知道如何处理它

My_form.html.erb

<%= error_messages_for(@section) %>

  <table summary="Section form fields">
      <tr>
        <th><%= f.label(:page_id, "Page ID") %></th>
         <td><%= f.select(:page_id, @pages.collect {|p| [p.name, p.id]}) %>
      </tr>
      <tr>
        <th><%= f.label(:name) %></th>
        <td><%= f.text_field(:name) %></td>
      </tr>
      <tr>
        <th><%= f.label(:position) %></th>
        <td><%= f.text_field(:position) %></td>
      </tr>
      <tr>
        <th><%= f.label(:visible) %></th>
        <td><%= f.select(:visible, 1..@section_count) %></td>
      </tr>
      <tr>
        <th><%= f.label(:content_type) %></th>
        <td>
          <%= f.radio_button(:content_type, 'text') %> Text
          <%= f.radio_button(:content_type, 'HTML') %> HTML
        </td>
      </tr>
      <tr>
        <th><%= f.label(:content) %></th>
        <td><%= f.text_area(:content, :size => '40x10') %></td>
      </tr>
    </table>

正文
HTML
“40x10”)%%>
我的分区控制器

class SectionsController < ApplicationController

  layout "admin"

  before_action :confirm_logged_in
  before_action :find_page

  def index
    @sections = @page.sections.sorted
  end

  def show
    @section = Section.find(params[:id])
  end

  def new
    @section = Section.new({:name => "Default", :page_id => @page.id})
    @section_count = Section.count +1
  end

  def create
    @section = Section.new(section_params)
    if @section.save
      flash[:notice] = "Section created successfully."
      redirect_to(:action => 'index', :page_id => @page.id)
    else
      @pages = @page.subject.pages.sorted
      @section_count = Section.count +1
      render('new')
    end
  end

  def edit
    @section = Section.find(params[:id])
  end

  def update
    @section = Section.find(params[:id])
    if @section.update_attributes(section_params)
      flash[:notice] = "Section updated successfully."
      redirect_to(:action => 'show', :id => @section.id, :page_id => @page.id)
    else
      @section_count = Section.count 
      render('edit')
    end
  end

  def delete
    @section = Section.find(params[:id])
  end

  def destroy
    @section = Section.find(params[:id]).destroy
    flash[:notice] = "Section destroyed successfully"
    redirect_to(:action => 'index' , :page_id => @page.id)
  end

  private

  def section_params
    params.require(:section).permit(:page_id, :name, :position, :visible, :content_type, :content)
  end

  def find_page
    if params[:page_id]
      @page = Page.find(params[:page_id])
    end
  end
end
类节控制器“Default”,:page_id=>@page.id})
@截面计数=截面计数+1
结束
def创建
@截面=截面。新建(截面参数)
如果@section.save
flash[:notice]=“已成功创建节。”
重定向到(:action=>'index',:page\u id=>@page.id)
其他的
@pages=@page.subject.pages.sorted
@截面计数=截面计数+1
呈现('新')
结束
结束
定义编辑
@section=section.find(参数[:id])
结束
def更新
@section=section.find(参数[:id])
如果@section.update_属性(section_参数)
flash[:notice]=“节已成功更新。”
重定向到(:action=>'show',:id=>@section.id,:page.\u id=>@page.id)
其他的
@section\u count=section.count
渲染('编辑')
结束
结束
def删除
@section=section.find(参数[:id])
结束
def销毁
@section=section.find(params[:id]).destroy
flash[:notice]=“部分已成功销毁”
重定向到(:action=>'index',:page\u id=>@page.id)
结束
私有的
def截面参数
参数require(:section).permit(:页面id,:名称,:位置,:可见,:内容类型,:内容)
结束
def查找页面
如果参数[:第页\u id]
@page=page.find(参数[:page\u id])
结束
结束
结束

嘿,您正在尝试调用表单上
nil
@pages
对象上的
collect
方法

因此,请在新操作中替换代码,如下所示:

def new
    @section = Section.new({:name => "Default", :page_id => @page.id})
    @section_count = Section.count +1
    @pages = @page.subject.pages.sorted
end

现在
@pages
不为空,因此您可以在其上调用
collect
方法。

您正试图在表单上的
@pages
对象上调用
collect
方法,该对象为
nil

因此,请在新操作中替换代码,如下所示:

def new
    @section = Section.new({:name => "Default", :page_id => @page.id})
    @section_count = Section.count +1
    @pages = @page.subject.pages.sorted
end

现在
@pages
不是空的,所以你可以调用它的
collect
方法。

接受
@VishalJAIN
的答案,这只是你第二个问题的一个补充


错误

每个计算机错误都是特定的;80%的战斗是识别错误本身

您的错误在Rails中比较常见:

未定义的方法用于

这意味着您正在调用解释器无法识别的“方法”:

@pages.collect {|p| [p.name, p.id]})
@pages
没有
collect
方法,或者未定义
@pages
变量

正如评论中指出的,在
新操作中添加
@pages=…
可以解决问题

--

原因

错误的原因是,由于Ruby以及Rails的优点是,每次调用变量/方法时,Ruby都需要让它可用

在大多数语言中,您会收到一个“变量未声明”错误——只有定义了变量才能引用它们;Ruby将所有内容放入对象中

undefined method 'collect' for "nil:NilClass"

如果您在应用程序中看到上述错误,则表示您尚未声明所引用的变量。

接受
@VishalJAIN
的回答,这只是第二个问题的附加模块


错误

每个计算机错误都是特定的;80%的战斗是识别错误本身

您的错误在Rails中比较常见:

未定义的方法用于

这意味着您正在调用解释器无法识别的“方法”:

@pages.collect {|p| [p.name, p.id]})
@pages
没有
collect
方法,或者未定义
@pages
变量

正如评论中指出的,在
新操作中添加
@pages=…
可以解决问题

--

原因

错误的原因是,由于Ruby以及Rails的优点是,每次调用变量/方法时,Ruby都需要让它可用

在大多数语言中,您会收到一个“变量未声明”错误——只有定义了变量才能引用它们;Ruby将所有内容放入对象中

undefined method 'collect' for "nil:NilClass"

如果您在应用程序中看到上述错误,这意味着您尚未声明正在引用的变量。

请将
@pages=@page.subject.pages.sorted
添加到
新建
操作中,因为
新建
中的@pages为零,所以它会给出此值error@VishalJAIN我想把你的评论作为主要的回答。你的销售代表是否对此感到失望?@VishalJAIN将不得不写下答案。他们将
@pages=@page.subject.pages.sorted
添加到你的
新操作中,因为
新操作中的@pages为零,所以它会给你这个答案error@VishalJAIN我想把你的评论作为主要的回答。你的代言人会为此感到失望吗?@VishalJAIN将不得不写下答案谢谢你的详细解释,我总是喜欢你的答案谢谢!写它们是一种乐趣;你应该接受
@VishalJAIN
的回答,尽管他在评论中是正确的感谢详细的解释,我一直喜欢你的回答!写它们是一种乐趣;你应该接受VishalJAIN的回答,因为他在评论中是正确的