Я получаю неопределенный метод `each'для nil:NilClass... но он определен?

Я искал часы, но нигде не могу найти ответ. Я новичок в ruby ​​on rails и не могу понять, как это исправить. Причиной проблемы стало то, что я переместил переменную экземпляра из одного файла в другой, и теперь ссылки не работают, и ошибка всегда отображает: undefined метод `each'для nil:NilClass

вот мой код:

Application.html.erb:

    <% number = 1 %>
      <% @projects.each do |project| %>
      <%= link_to project, id: "a-#{number}" do %>
      <div class="flex">
          <div class="each--project" id="project-<%= number %>">
              <h3><%= project.title %></h3>
              <p class="date"><%= project.created_at.strftime("%A, %b %d")%></p>
              <p class="content"><%= project.description %></p>
          </div>
      </div>
      <% number = number + 1 %>
      <% end %>
      <% end %>

application_controller.rb

    class ApplicationController < ActionController::Base
      def index
         @projects = Project.all
      end
      protect_from_forgery with: :exception
    end

projects_controller

        class ProjectsController < ApplicationController
          before_action :find_project, only: [:show, :edit, :update, :destroy]
          before_action :authenticate_user!, except: [:index, :show]
          def index
           @projects = Project.all.order("created_at desc")
          end

          def new
           @project = Project.new
          end

          def create
           @project = Project.new project_params

          if @project.save
           redirect_to @project, notice: "Yay Mia! That project was             saved!"
          else
             render 'new'
          end
         end

         def show
         end

         def edit
         end

         def update
           if @project.update project_params
             redirect_to @project, notice: "Yay Mia! That project was updated!"
           else
             render 'edit'
           end
         end

         def destroy
           @project.destroy
           redirect_to projects_path
         end


         private

         def find_project
           @project = Project.friendly.find(params[:id])
         end

         def project_params
           params.require(:project).permit(:title, :description, :link, :slug)
         end

       end

маршруты рб

   Rails.application.routes.draw do
     devise_for :users
     resources :posts
     resources :projects
     resources :contacts, only: [:new, :create]
     get 'welcome/index'
     root 'welcome#index'

     get '*path' => redirect('/')
   end

2 ответа

Решение

У вас нет index действие на ApplicationControllerОднако вы можете достичь того же самого с before_action если вы хотите, чтобы он загружался для всех действий во всех контроллерах. Это не то, что я бы порекомендовал, хотя.

class ApplicationController < ActionController::Base
  before_action :load_projects

  def load_projects
    @projects = Project.all
  end
end

Подсказка:

<% number = 1 %>
<% @projects.each do |project| %>

может быть гораздо лучше написано как

<% @projects.each_with_index do |project, number| %>

Если вы ссылаетесь на что-то в основном макете приложения, то оно должно быть загружено для каждого контроллера. Помещение его в один конкретный контроллер включает его только тогда, когда этот контроллер используется, что будет происходить только на очень определенных маршрутах.

Если @projects необходимо заполнять при каждом запросе, переместить это в load_projects метод и добавить before_action фильтр в вашем главном ApplicationController. Положив его по умолчанию index метод не работает, это никогда не запустится.

Вы всегда можете заглушить в Rails.logger.debug('...') наберите звонки, чтобы увидеть, выполняется ли ваш код на самом деле. Часы log/development.log постоянно видеть, что происходит. Большинство проблем могут быть быстро решены путем изучения того, что было зарегистрировано.

Другие вопросы по тегам