NoMethodError в разделах # редактировать похожие проблемы с другими
Я немного новичок в Ruby и пишу программу с нуля... Я получаю сообщение об ошибке и не могу понять, откуда оно. Я провел больше часа, и я уверен, что это что-то глупо простое. У меня есть другие подобные страницы, которые работают нормально, но есть некоторая проблема с переменной экземпляра. Это почти такая же проблема, как приведенная ссылка.
Вот моя ошибка:
Showing C:/Users/kevin/Desktop/ruby_test/sites/simple_cms/app/views/sections/_form.html.erb where line #4 raised:
undefined method `collect' for nil:NilClass
Extracted source (around line #4):
1 <table summary="Section form fields">
2 <tr>
3 <th><%= f.label(:page_id, "Page") %></th>
4 <td><%= f.select(:page_id, @pages.collect {|p| [p.name, p.id]}) %>
5 </td>
6 </tr>
7 <tr>
Trace of template inclusion: app/views/sections/edit.html.erb
Rails.root: C:/Users/kevin/Desktop/ruby_test/sites/simple_cms
Вот моя страница форм:
<table summary="Section form fields">
<tr>
<th><%= f.label(:page_id, "Page") %></th>
<td><%= f.select(:page_id, @pages.collect {|p| [p.name, p.id]}) %>
</td>
</tr>
<tr>
<th><%= f.label(:name) %></th>
<td><%= f.text_field(:name) %></td>
</tr>
<tr>
<th><%= f.label(:position) %></th>
<td><%= f.select(:position, 1..@section_count) %></td>
</tr>
<tr>
<th><%= f.label(:visible) %></th>
<td><%= f.check_box(:visible) %></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"
def index
@sections = Section.sorted
end
def show
@section = Section.find(params[:id])
end
def new
@section = Section.new({:name => "Default"})
@pages = Page.order('position ASC')
@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')
else
@pages = Page.order('position ASC')
@section_count = Section.count
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)
else
@pages = Page.order('position ASC')
@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')
end
private
def section_params
params.require(:section).permit(:page_id, :name, :position, :visible, :content_type, :content)
end
end
Вот страница просмотра (правка):
<% @page_title = "Edit Section" %>
<%= link_to("<< Back to List", {:action => 'index'}, :class => 'back-link') %>
<div class="sections edit">
<h2>Update Section</h2>
<%= form_for(:section, :url => {:action => 'update', :id => @section.id}) do |f| %>
<%= render(:partial => "form", :locals => {:f => f}) %>
<div class="form-buttons">
<%= submit_tag("Update Section") %>
</div>
<% end %>
</div>
1 ответ
Решение
Вы должны определить @pages
а также @section_count
переменные в соответствующем действии контроллера:
def edit
@section = Section.find(params[:id])
@pages = Page.order('position ASC')
@section_count = Section.count
end
У вас также есть ошибка в создании действия. Когда это не создает запись, @section_count
должно быть Section.count + 1
как в new
действие.
Ваш контроллер также может быть рефрактором к этому