NoMethodError in Sections#редактировать похожую проблему на другую

Я немного новичок в 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>

person KevinW    schedule 18.06.2014    source источник
comment
Это не связано с вашим вопросом, но для ваших форм я бы рекомендовал использовать рубиновый драгоценный камень под названием simple_form от platformatec. Это действительно удобный способ генерировать формы для вашего приложения :)   -  person Joe Hilton    schedule 18.06.2014


Ответы (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.

Ваш контроллер также может быть преломлен к этому

person zishe    schedule 18.06.2014
comment
Я думаю, что понял. Итак, является ли ответ эффективным, что мне нужно было либо объявить переменную, либо установить для нее значение «ноль», чтобы передать ее функции редактирования (цель ||=)? Что вы имеете в виду передать его в частичной форме? Мне удалось заставить ваше предложение работать со вторыми двумя наборами кода без первого предоставленного вами раздела кода. Я также смог альтернативно решить эту проблему, установив 'code'@pages = Page.order('position ASC') & @section_count = Section.count'code' в самом верху контроллера разделов. Это уместно? Я поймал +1, спасибо, что указали на это. - person KevinW; 18.06.2014
comment
Да, я думаю, что больше этого делать не нужно. Просто создайте эти переменные, и они будут доступны в частичном представлении. Ты прав. - person zishe; 18.06.2014