2015-11-28 2 views
0

Я пытаюсь гнездо Sections в Page в моем тренировочном коде, и я получаю эту ошибку:NoMethodError в SectionsController # индекс пытаются гнездиться

undefined method `sections' for nil:NilClass 

Перед этим я вложенными в Subjects мой Page успешно.

См. Ошибку на рисунке ниже, пытаясь вложить разделы в страницу.

Error

Вот что я сделал:

sections_controller.rb:

class SectionsController < ApplicationController 

    layout 'admin' 

    before_action :confirm_logged_in 
    before_action :find_page 

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

    private 

    def find_page 
     if params[:page_id] 
     @page = Page.find(params[:page_id]) 
     end 
    end 
end 

Мой Вид:

index.html.erb:

<% @page_title = 'Sections' %> 

<%= link_to('<< Back to Pages', {:controller => 'pages', :action => 'index', :subject_id => @page.subject_id}, :class => 'back-link') %> 

<div class="sections index"> 
    <h2>Sections</h2> 

    <%= link_to('Add New Section', {:action => 'new', :page_id => @page.id, :page_id => @page.id}, :class => 'action new') %> 

    <table class="listing" summary="Section list"> 
    <tr class="header"> 
     <th>&nbsp;</th> 
     <th>Page</th> 
     <th>Section</th> 
     <th>Content Type</th> 
     <th>Visible</th> 
     <th>Actions</th> 
    </tr> 
    <% @sections.each do |section| %> 
    <tr> 
     <td><%= section.position %></td> 
     <td><%= section.page.name if section.page %></td> 
     <td><%= section.name %></td> 
     <td><%= section.content_type %></td> 
     <td class="center"><%= status_tag(section.visible) %></td> 
     <td class="actions"> 
     <%= link_to('Show', {:action => 'show', :id => section.id, :page_id => @page.id}, :class => 'action show') %> 
     <%= link_to('Edit', {:action => 'edit', :id => section.id, :page_id => @page.id}, :class => 'action edit') %> 
     <%= link_to('Delete', {:action => 'delete', :id => section.id, :page_id => @page.id}, :class => 'action delete') %> 
     </td> 
    </tr> 
    <% end %> 
    </table> 
</div> 
+0

С какой страницы вы пытаетесь вызвать действие 'index' вашего контроллера раздела? То есть ссылку, которую вы нажали, прежде чем вы получили эту ошибку. Можете ли вы показать нам свой код для ссылки? –

+0

@SunnyK, я вызываю его непосредственно по своему маршруту с помощью этого URL-адреса. http://127.0.0.1:3000/sections –

+0

Если я удалю все вложения, его работы. Как CMS, я вставляю разделы в страницу, чтобы иметь только связанную запись в моей CMS. Позвольте мне вставить код без вложенности, который работал после того, как я http://127.0.0.1:3000/sections –

ответ

0

Хорошо, давайте шаг за шагом; сначала перейти на маршрут указательного разделов, и это код для действия индекса:

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

Вы также before_action :find_page, который должен установить @page:

def find_page 
    if params[:page_id] 
    @page = Page.find(params[:page_id]) 
    end 
end 

, но это никогда не бывает потому что либо params[:page_id] - nil, либо нет страницы, на которой указан идентификатор. Таким образом, @page - это нуль, и вы вызываете nil.sections, и инициированное вами исключение вызывается.

Как вы проходите page_id, как параметр url?

Возможно ли, что вы на самом деле предназначены нечто подобное в маршрутах:

resources :pages do 
    resources :sections 
end 

Если да, то правильный маршрут индекс раздел будет выглядеть следующим образом:

page_sections GET /pages/:page_id sections(.:format) sections#index 
+0

приятное понимание. http://127.0.0.1:3000/sections?page_id=2 работало и заполняло мою страницу разделов. Но мне все равно понравится http://127.0.0.1:3000/sections. Это все, что у меня есть в моем маршруте.rb get 'admin',: to => 'access # index' match ': controller (/: action (/: id))',: via => [ : get,: post] –

+0

У вас есть решение, но я все еще не могу найти решение здесь для работы –

+0

, пожалуйста, напишите, что вы пробовали, и какова ошибка. Вы адаптировали маршруты? – bosskovic

Смежные вопросы