Я получаю неопределенный метод `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
постоянно видеть, что происходит. Большинство проблем могут быть быстро решены путем изучения того, что было зарегистрировано.