2016-11-25 2 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 возникает из-за значения nil 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 быть! Я попробую позже и дам вам знать спасибо Бала! – Eltorero1992

+0

Я не использую devise, поэтому я не смогу сделать это так, но current_user не должен иметь никаких данных, поскольку ни один пользователь не вошел в систему. Что касается authenticate_user, по сути, я сделал то же самое через logged_in_user (первая строка на странице контроллера проектов) – Eltorero1992

+0

@ Eltorero1992 Я внесли некоторые изменения в ответ, посмотрев на него. –