rails 中 nil:NilClass 的未定义方法“错误”
undefined method `errors' for nil:NilClass in rails
我已经创建了项目脚手架和阶段 scaffold.i 在项目的显示页面上呈现了一个按钮,用于打开阶段形式。但我没有收到任何方法错误。我想将 project_id 传递给创建的阶段。我在项目和阶段之间有一对多的关联。
error
projects_controller.rb
def index
@projects = current_user.projects.all.paginate(page: params[:page], per_page: 15)
end
def show
@project=Project.find(params[:id])
@stages = Stage.all
end
stages_controller.rb
def index
@stages = Stage.all
end
def show
end
def new
@stages = Stage.new
@project = Project.find(params[:project_id])
end
def create
@project = Project.find(params[:project_id])
@stage = @project.stages.build(stages_params)
respond_to do |format|
if @stage.save
format.html { redirect_to @stage, notice: 'Stage was successfully created.' }
format.json { render :show, status: :created, location: @stage }
else
format.html { render :new }
format.json { render json: @stage.errors, status: :unprocessable_entity }
end
end
routes.rb
resources :projects do
resources :stages
end
型号project.rb
has_many :stages
耙路
Prefix Verb URI Pattern Controller#Action
tasks GET /tasks(.:format) tasks#index
POST /tasks(.:format) tasks#create
new_task GET /tasks/new(.:format) tasks#new
edit_task GET /tasks/:id/edit(.:format) tasks#edit
task GET /tasks/:id(.:format) tasks#show
PATCH /tasks/:id(.:format) tasks#update
PUT /tasks/:id(.:format) tasks#update
DELETE /tasks/:id(.:format) tasks#destroy
project_stages GET /projects/:project_id/stages(.:format) stages#index
POST /projects/:project_id/stages(.:format) stages#create
new_project_stage GET /projects/:project_id/stages/new(.:format) stages#new
edit_project_stage GET /projects/:project_id/stages/:id/edit(.:format) stages#edit
project_stage GET /projects/:project_id/stages/:id(.:format) stages#show
PATCH /projects/:project_id/stages/:id(.:format) stages#update
PUT /projects/:project_id/stages/:id(.:format) stages#update
DELETE /projects/:project_id/stages/:id(.:format) stages#destroy
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy
项目show.html.erb
<%= link_to "Add Stage", new_project_stage_url(@project), :class=>"button primary small" %>
updated error
我认为你有一个错误,因为在你的新方法中你设置了一个名为@stages 的变量
def new
@stages = Stage.new
@project = Project.find(params[:project_id])
end
但在您看来,您使用的是一个名为@stage 的变量。
只需在您的控制器方法#new 中将@stages 更改为@stage,这样您就可以了:
def new
@stage = Stage.new
@project = Project.find(params[:project_id])
end
在你看来:
<% if @stage.errors.any? %>
您正在使用嵌套路由,但在 form_with
中您没有指定。尝试像这样更改 form_with
:
form_with(model: stage, url: [@project, stage])
来源:
您必须检查变量名称,即 stage
变量应具有新的 Stage
对象,而 @project
变量应具有 Project
对象或否则请相应地更改名称。
我已经创建了项目脚手架和阶段 scaffold.i 在项目的显示页面上呈现了一个按钮,用于打开阶段形式。但我没有收到任何方法错误。我想将 project_id 传递给创建的阶段。我在项目和阶段之间有一对多的关联。 error
projects_controller.rb
def index
@projects = current_user.projects.all.paginate(page: params[:page], per_page: 15)
end
def show
@project=Project.find(params[:id])
@stages = Stage.all
end
stages_controller.rb
def index
@stages = Stage.all
end
def show
end
def new
@stages = Stage.new
@project = Project.find(params[:project_id])
end
def create
@project = Project.find(params[:project_id])
@stage = @project.stages.build(stages_params)
respond_to do |format|
if @stage.save
format.html { redirect_to @stage, notice: 'Stage was successfully created.' }
format.json { render :show, status: :created, location: @stage }
else
format.html { render :new }
format.json { render json: @stage.errors, status: :unprocessable_entity }
end
end
routes.rb
resources :projects do
resources :stages
end
型号project.rb
has_many :stages
耙路
Prefix Verb URI Pattern Controller#Action
tasks GET /tasks(.:format) tasks#index
POST /tasks(.:format) tasks#create
new_task GET /tasks/new(.:format) tasks#new
edit_task GET /tasks/:id/edit(.:format) tasks#edit
task GET /tasks/:id(.:format) tasks#show
PATCH /tasks/:id(.:format) tasks#update
PUT /tasks/:id(.:format) tasks#update
DELETE /tasks/:id(.:format) tasks#destroy
project_stages GET /projects/:project_id/stages(.:format) stages#index
POST /projects/:project_id/stages(.:format) stages#create
new_project_stage GET /projects/:project_id/stages/new(.:format) stages#new
edit_project_stage GET /projects/:project_id/stages/:id/edit(.:format) stages#edit
project_stage GET /projects/:project_id/stages/:id(.:format) stages#show
PATCH /projects/:project_id/stages/:id(.:format) stages#update
PUT /projects/:project_id/stages/:id(.:format) stages#update
DELETE /projects/:project_id/stages/:id(.:format) stages#destroy
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy
项目show.html.erb
<%= link_to "Add Stage", new_project_stage_url(@project), :class=>"button primary small" %>
updated error
我认为你有一个错误,因为在你的新方法中你设置了一个名为@stages 的变量
def new
@stages = Stage.new
@project = Project.find(params[:project_id])
end
但在您看来,您使用的是一个名为@stage 的变量。
只需在您的控制器方法#new 中将@stages 更改为@stage,这样您就可以了:
def new
@stage = Stage.new
@project = Project.find(params[:project_id])
end
在你看来:
<% if @stage.errors.any? %>
您正在使用嵌套路由,但在 form_with
中您没有指定。尝试像这样更改 form_with
:
form_with(model: stage, url: [@project, stage])
来源:
您必须检查变量名称,即 stage
变量应具有新的 Stage
对象,而 @project
变量应具有 Project
对象或否则请相应地更改名称。