0

我一直在寻找几个小时,但我无法在任何地方找到答案。我是 ruby​​ on rails 的新手,我不知道如何解决这个问题。导致问题的原因是我将一个实例变量从一个文件移动到另一个文件,现在没有链接正在工作,并且错误总是显示:undefined method `each' for nil:NilClass

这是我的代码:

应用程序.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

项目_控制器

        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
4

2 回答 2

1

您没有index操作,但是如果您希望为所有控制器中的所有操作加载它,ApplicationController 您可以使用 a 实现相同的操作。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| %>
于 2017-01-28T21:54:33.470 回答
0

如果您在主应用程序布局中引用某些内容,则必须为每个控制器加载它。将它放在一个特定的控制器中只会在该控制器正在使用时使用它,它只会在非常特定的路线上。

如果@projects需要在每个请求上填充,请将其移至load_projects方法并before_action在主 ApplicationController 中添加过滤器。将它放在默认index方法中是行不通的,它永远不会运行。

您始终可以在Rails.logger.debug('...')类型调用中存根,以查看您的代码是否实际正在执行。不断观察log/development.log以了解正在发生的事情。通过检查记录的内容,可以快速解决大多数问题。

于 2017-01-28T21:53:45.917 回答