2016-11-25 53 views
0

這是我得到的錯誤:NoMethodError:未定義的方法`項目的零: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對象應該選擇它並檢查是否爲零,但是這可能不會發生。

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 

模型項目

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 

的可能是什麼任何想法?

謝謝!

回答

0

既不在create也不在project_owner current_user被定義,或者你是否在你的過濾器中這樣做?那麼你也必須這樣做project_owner

+0

謝謝您的回答Fallenhero,你是對的,我已經定義CURRENT_USER – Eltorero1992

1

此current_user錯誤是由於current_user在project_owner方法中的值爲零。

更改此方法

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

這聽起來像它mighg吧!以後我會試試看,謝謝Bala! – Eltorero1992

+0

我沒有使用設計,所以我不能這樣做,但是current_user不應該有任何數據,因爲沒有用戶登錄。關於authenticate_user,本質上我已經通過logged_in_user(第一行在項目控制器頁面上) – Eltorero1992

+0

@ Eltorero1992我已經對答案進行了一些修改。 –

相關問題