向我的同事们致以问候。我有两个问题。 1当然是我如何解决这个问题。第二,这个错误意味着什么,所以对于我的下一次遇到我知道如何处理它。
我的_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>
我的部门控制器
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
答案 0 :(得分:2)
嘿,您试图在collect
@pages
对象上调用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
方法。
答案 1 :(得分:2)
接受@VishalJAIN
的回答,这只是第二个问题的加载项。
错误强>
每个计算机错误都是特定的; 80%的战斗是识别错误本身。
您的错误在Rails中相对常见:
未定义的方法 for ...
这意味着您正在调用&#34;方法&#34;这是口译员无法识别的:
@pages.collect {|p| [p.name, p.id]})
... @pages
要么没有collect
方法,要么没有定义@pages
变量。
正如评论中所指出的,在@pages = ...
操作中添加new
可以解决问题。
-
<强>原因强>
错误的原因是,由于Ruby和Rails是object orientated,每次调用变量/方法时,Ruby 都需要才能使它可用。
在大多数语言中,您都会收到未声明的&#34;变量&#34;错误 - 变量只有在定义后才能被引用; Ruby将所有内容都放入对象:
undefined method 'collect' for "nil:NilClass"
如果您在应用程序中看到上述错误,则表示您尚未声明您引用的变量。