首页 > 解决方案 > 无法使用rails + undefined方法`projects'为nil创建和保存模型的新实例:NilClass - Thinbug

问题描述

我在获取要保存的模型的新实例时遇到了麻烦,有人说这可能是我的关联,所以我回去编辑它们,还删除了我的迁移并重新运行 rake db:migrate(这可能是一个错误,但在这里我被填满了遗憾并完成了),现在我继续 undefined method `projects' for nil:NilClass - Stack Overflow 这样做,现在我很确定我没有解决保存问题,并且也造成了一个全新的混乱。

我会尽量在这里包含尽可能多的细节。这可能比我意识到的要简单得多,但我正在接种第二剂疫苗,感觉就像垃圾一样。

我的模型

class Project < ApplicationRecord
  belongs_to :volunteer
  belongs_to :team

  def self.find_latest_five
    order(id: :desc).limit(5)
  end
end
class Team < ApplicationRecord
    has_many :volunteers, through: :projects
    has_many :projects

    #validates :content, presence: true 
end
class Volunteer < ApplicationRecord
has_many :projects
has_many :teams, through: :projects
has_secure_password
end

我的控制器


    helper_method :current_volunteer, :logged_in?
    #these gives access to methods in views
    
    private 
    def current_volunteer
        @current_volunteer ||= Volunteer.find_by_id(session[:volunteer_id]) if session[:volunteer_id]
    end

    def logged_in?
        !!session[:volunteer_id]
    end

    def redirect_if_not_logged_in?
        redirect_to '/' if !logged_in?
    end
end
class VolunteersController < ApplicationController
    def new
        @volunteer = Volunteer.new
    end



    def create
       @volunteer = Volunteer.new(volunteer_params)
       if @volunteer.save
        session[:volunteer_id] = @volunteer.id
        redirect_to @volunteer
       else
        render :new
       end
    end 

    def show
        redirect_if_not_logged_in?
        @volunteer = Volunteer.find_by_id(params[:id])
        redirect_to '/' if !@volunteer
    end

    private 

    def volunteer_params
        params.require(:volunteer).permit(:username, :email, :password)
    end 

end
class ProjectsController < ApplicationController
    before_action :redirect_if_not_logged_in?

    def new 
        @project = Project.new
    end

    def create
        #render plain: params[:project].inspect
        #@project = current_volunteer.projects.new(project_params)
        @project = current_volunteer.projects.build(project_params)
        if @project.save!
            flash[:notice] = "Project was succesfully created"
            redirect_to projects_path
        else 
            render :new
    end  
end

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


    def index 
        @projects = Project.all 
    end 

    #def index 
       #if params[:volunteer_id] && @volunteer = Volunteer.find_by_id(params[:project_id])
                #@projects = @volunteer.projects
        #else
            #@error = "This isn't an existing volunteer" if params[:volunteer_id]
            #@projects = Projects.all
        #end
    #end


    private 

    def project_params
        params.require(:project).permit(:title, :content)
    end

end
class TeamsController < ApplicationController
    before_action :redirect_if_not_logged_in

    def index 
        if params[project_id] && @project = Project.find_by_id(params[:project_id])
                @teams = @project.teams
        else
            @error = "That isn't a current project."
            @teams = Team.all
        end
    end


    def new 

        if params[project_id] && @project = Project.find_by_id(params[:project_id])
            @team = @project.teams.build
            @team.save!
        else

            @error = "That isn't a current project." if params[:project_id]
            @team = Team.new

    end 
end

    def create
        @team = current_volunteer.teams.build(teams_params)
        if @team.save 
         redirect_to teams_path 
        else
            render :new
        end
    end

    def show 
        @team = Team.find_by(id: params[:id])
    end

    def edit
        @team = Team.find_by(id: params[:id])
    end

    def update
        @team = Team.find_by(id: params[:id])
        if @team.update(team_params)
            redirect_to team_path(@team)
        else
            render :edit
        end 
    end

    private 

    def teams_params
        params.require(:team).permit(:content,:project_id)
    end
end

和迁移表

class CreateProjects < ActiveRecord::Migration[6.1]
  def change
    create_table :projects do |t|
      t.string :title
      t.text :content
      t.belongs_to :volunteer, foreign_key: true
   


      t.timestamps
    end
  end
end
  def change
    create_table :volunteers do |t|
      t.string :username
      t.string :email
      t.string :password_digest

      t.timestamps
    end
  end
end
class CreateTeams < ActiveRecord::Migration[6.1]
  def change
    create_table :teams do |t|
      t.string :content
      t.references :volunteer, foreign_key: true
      t.references :project, foreign_key: true

      t.timestamps
    end
  end
end

提前感谢您提供的任何见解!

标签: ruby-on-railsmodel

解决方案


使 db:rollback 并将t.belongs_to :volunteer, foreign_key: true更改为t.references :volunteer, foreign_key: true在项目迁移时,应该对我有所帮助


推荐阅读