2016-11-25 6 views
0

これは私が取得していますエラーです:NoMethodError:nilのための未定義のメソッド `プロジェクト:NilClass

Error: 
ProjectsControllerTest#test_should_redirect_destroy_when_not_logged_in: 
NoMethodError: undefined method `projects' for nil:NilClass 
    app/controllers/projects_controller.rb:39:in `project_owner' 
    test/controllers/projects_controller_test.rb:19:in `block (2 levels) in <class:ProjectsControllerTest>' 
    test/controllers/projects_controller_test.rb:18:in `block in <class:ProjectsControllerTest>' 

を私が間違っている場合、私が起こって、正しいと思われるものは、コードが行くを検索したときにということですユーザーがログインしていないことが分かったプロジェクトは、そのようなproject_ownerは存在しません。それでも、project_ownerオブジェクトはそれを選択し、それがnilであることを確認する必要がありますが、それは起こっていない可能性があります。プロジェクト

class Project < ApplicationRecord 
    before_save {name.downcase!} 
    belongs_to :user 
    default_scope -> { order(created_at: :desc) } 
    mount_uploader :picture, PictureUploader 
    validates :user_id, presence: true 
    validates :name && :category, presence: true 
    validates :name, presence: true, 
        uniqueness: { case_sensitive: false } 

テストスーツ

require 'test_helper' 

class ProjectsControllerTest < ActionDispatch::IntegrationTest 

    def setup 
    @project = projects(:Flyingcar) 
    end 

    test "should redirect destroy when not logged in" do 
    assert_no_difference 'Project.count' do 
    delete project_path(@project) 
    end 
    assert_redirected_to login_url 
    end 

それが何であるかの任意のアイデアのための

Projects.Controller

class ProjectsController < ApplicationController 
before_action :logged_in_user, only: [:index, :show, :create] 
before_action :project_owner, only: :destroy 

def index 
end 

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

def new 
    @project = Project.new 
end 

def create 
    @project = current_user.projects.build(project_params) 
    if @project.save 
     flash[:success] = "Project Created" 
     redirect_to @project 
    else 
     render 'new' 
    end 
end 

def destroy 
    @project.destroy 
    flash[:success] = "Project Deleted" 
    redirect_to request.referrer || root_url 
    end 

private 

def project_params 
    params.require(:project).permit(:name,:category,:picture) 
end 

def project_owner 
    @project = current_user.projects.find_by(id: params[:id]) 
    redirect_to root_url if @project.nil? 
end 

end 

モデル?

ありがとうございます!

答えて

0

createでもproject_ownerでも、current_userは定義されていますか、それともフィルタで処理していますか?その後、あなたもそれを行う必要がありますproject_owner

+0

に、この方法では、あなたは私がそれを可能mighgように聞こえるCURRENT_USER – Eltorero1992

1

このcurrent_userエラーは、project_ownerメソッドのcurrent_userのnil値によるものです。

変更のおかげであなたの答えFallenheroため

def project_owner 
    if current_user.nil? 
    redirect_to root_url 
    else 
    @project = current_user.projects.find_by(id: params[:id]) 
    redirect_to root_url if @project.nil? 
    end 
end 
+0

を定義している権利です!それを後で試してみて、感謝の気持ちを知らせてください。バラ! – Eltorero1992

+0

私はdeviseを使用していないので、そのようにすることはできませんが、current_userはユーザーがログインしていないのでデータを持たないはずです。authenticate_userに関しては、本質的にはlogged_in_userプロジェクトコントローラのページで) – Eltorero1992

+0

@ Eltorero1992私は答えをいくつか変更しました。 –

関連する問題