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 对象或否则请相应地更改名称。