我为 nil:NilClass 得到一个未定义的方法“each”...但它已定义?
I'm getting an undefined method `each' for nil:NilClass...but it is defined?
我已经搜索了几个小时,但我无法在任何地方找到答案。我是 rails 上 ruby 的新手,我不知道如何解决这个问题。导致问题的原因是我将一个实例变量从一个文件移动到另一个文件,现在没有链接工作并且错误总是显示:undefined method `each' for 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
路线 rb
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
如果您在主应用程序布局中引用某些内容,则必须为每个 控制器加载它。将它放在一个特定的控制器中只会在该控制器正在使用时使用它,它只会在非常特定的路线上。
如果每个请求都需要填充 @projects
,请将其移至 load_projects
方法并在您的主 ApplicationController 中添加一个 before_action
过滤器。把它放在默认的 index
方法中是行不通的,那永远不会得到 运行.
您始终可以在 Rails.logger.debug('...')
类型调用中存根,以查看您的代码是否真正被执行。不断观察 log/development.log
以了解发生了什么。大多数问题都可以通过检查记录的内容快速解决。
您没有对 ApplicationController
进行 index
操作
但是,如果您希望为所有控制器中的所有操作加载它,则可以使用 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| %>
我已经搜索了几个小时,但我无法在任何地方找到答案。我是 rails 上 ruby 的新手,我不知道如何解决这个问题。导致问题的原因是我将一个实例变量从一个文件移动到另一个文件,现在没有链接工作并且错误总是显示:undefined method `each' for 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
路线 rb
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
如果您在主应用程序布局中引用某些内容,则必须为每个 控制器加载它。将它放在一个特定的控制器中只会在该控制器正在使用时使用它,它只会在非常特定的路线上。
如果每个请求都需要填充 @projects
,请将其移至 load_projects
方法并在您的主 ApplicationController 中添加一个 before_action
过滤器。把它放在默认的 index
方法中是行不通的,那永远不会得到 运行.
您始终可以在 Rails.logger.debug('...')
类型调用中存根,以查看您的代码是否真正被执行。不断观察 log/development.log
以了解发生了什么。大多数问题都可以通过检查记录的内容快速解决。
您没有对 ApplicationController
进行 index
操作
但是,如果您希望为所有控制器中的所有操作加载它,则可以使用 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| %>