0

私は何時間も探してきましたが、答えはどこにも見つかりません。私はレール上でルビーの新しさと私はこれを修正する方法を把握することはできません。何が問題を引き起こしたことは私は1つのファイルから別のインスタンス変数を移動し、今はリンクが機能していないということで、エラーが常に表示されます。nilのための未定義のメソッド `それぞれの」:ここNilClass私は未定義のメソッド `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 
+0

のように書くことができますか?それらのすべてまたは特定のものだけ? – Max

+0

全部ありました – Mia

答えて

1

あなたはそれがすべてのコントローラ内のすべてのアクションのためにロードされたい場合は、しかしbefore_actionと同じことを達成することができますApplicationControllerindexアクションを持っていません。これは私が推薦するものではありません。

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| %> 
+0

ありがとうございました!これはうまくいった: – Mia

+0

それは素晴らしいですが、私はあなたが物事をどのようにしているのか再考するでしょう、本当にあなたが本当に必要なコントローラをどこにでも必要としない限り、この 'before_action'を必要な場所に置くだけです。 – Iceman

+1

これはフッターの一部であるため、すべてのページに表示されるので、これを行うのが理にかなっていると思います。 – Mia

0

をrbは。 1つの特定のコントローラに配置するのは、そのコントローラが使用されているときにのみ実行され、非常に特定のルートにしか配置されません。

リクエストごとに@projectsを入力する必要がある場合は、load_projectsメソッドに移動し、before_actionフィルタをメインのApplicationControllerに追加します。それをデフォルトのindexメソッドに入れても機能しません。実行されることはありません。

いつでもRails.logger.debug('...')型呼び出しでスタブして、コードが実際に実行されているかどうかを確認できます。 log/development.logを見て、何が起こっているかを見てください。ログに記録されている内容を調べることで、ほとんどの問題をすばやく解決できます。

関連する問題