ruby-on-rails - 无法使用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
提前感谢您提供的任何见解!
解决方案
使 db:rollback 并将t.belongs_to :volunteer, foreign_key: true更改为t.references :volunteer, foreign_key: true在项目迁移时,应该对我有所帮助
推荐阅读
- doxygen - 使用 doxygen 编译帮助后打开 CHM 时出错
- odoo - 数据库未连接到 odoo 服务器
- r - 按特定列值过滤日期
- c - 单独打印两个绑定在一起的小字符串的最有效方法
- docker-swarm - Docker Swarm - Prometheus cannot access Cadvisor: dial tcp 10.0.0.50:8090: connect: connection refused
- javascript - Overwriting document in firebase
- php - 数组堆叠在另一个数组上
- web-scraping - 使用 python-requests 抓取网页时如何获取丢失的 HTML 数据
- istio - 方法调用的 Micronaut 和 OpenTracing
- swift - initializing static variable in different ways with swift