2014-11-10 3 views
0

У меня есть sidebard для отображения @noticesRails: Sidebar Конфликт

<% @notices.each do |notice| %> 
<li class="list-group-item notice"><%= short_auto_link(notice.content) %></li> 
<% end %> 

У меня также есть интерфейс администратора для управления уведомления (например CRUD.).

Проблема в том, что когда я открываю edit или new для notice. Отметьте undefined method 'each' for nil:NilClass за <% @notices.each do |notice| %>.

Теперь я могу уйти от этого путем добавления <% if @notices %> до блока .each.

UPDATE:

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_filter :set_notice 

    def set_notice 
    @notices = Notice.all 
    end 
end 

app/views/notices/_notice_board.html.erb:8:in `_app_views_notices__notice_board_html_erb__624099781_29657256' 
app/views/layouts/application.html.erb:19:in `_app_views_layouts_application_html_erb___900927418_28913616' 
+0

Просьба показать контроллер, где вы определяете '@ notices' –

+0

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

+0

@ User089247 см. Мой UPDATE – cqcn1991

ответ

1

Вы должны изменить это:

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_filter :set_notice 

    def set_notice 
    @notices = Notice.all 
    end 
end 

к этому:

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_filter :set_notices 

    def set_notices 
    @notices = Notice.all 
    end 
end 

То, что вы можете узнать из этого является то, что всегда стараются избегать таких соглашений об именовании о методе. Поскольку вы устанавливаете @notices (множественное число), ваше имя метода также должно быть множественным: set_notices. В вашем случае метод set_notice переопределяется методом, определенным с таким же именем в NoticesController. Изменение имени метода, как указано выше, должно устранить проблему.

0

Если боковая панель разделяется только через все действия вашего admins_controller определить приватный метод, чтобы получить @notices в admins_controller, и положить before_filter в начале контроллера.

в admins_controller ::

before_filter :prepare_notices 

def show 
end 

def edit 
end 

... 
private 
def prepare_notices 
    @notices = YOUR_QUERY 
end 

Если боковая панель будет оказываться по всему сайту переместить код на application_controller и перед любым запросом к вам серверу, этот метод будет выполняться.

Если боковая панель будет оказана с некоторыми действиями в вашем веб-сайте вы должны поставить метод get_notices в application_controller и использовать before_filter в каждом контроллере с указанием действий, которые делают только на боковой панели.

+0

Именно так я определяю свои «@ уведомления». Похоже, это не поможет. – cqcn1991

+0

Я уверен, что это работает, но дайте мне знать, как именно вы это делаете, я могу вам помочь. –

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