没有传递给控制器​​的参数

时间:2017-10-04 11:40:03

标签: ruby-on-rails ruby

我试图将一个client_id参数从我的一个视图传递给另一个模型控制器,但似乎没有传递参数,因为我得到了错误"未定义的方法`client_id =&# 39;为零:NilClass"在set_client方法中。我究竟做错了什么?任何帮助,将不胜感激。感谢

<%= link_to 'New assessment', new_assessment_path(:client_id => @client.id), class: "btn btn-xs btn-success" %>

这是我的控制者:

class AssessmentsController < ApplicationController
  before_action :set_assessment, only: [:show, :edit, :update, :destroy]
  before_action :set_client, only: [:new]

  def new
    @assessment = Assessment.new
  end



 def create
    @assessment = Assessment.new(assessment_params)
    respond_to do |format|
      if @assessment.save
        format.html { redirect_to @assessment, notice: 'Assessment was successfully created.' }
        format.json { render :show, status: :created, location: @assessment }
      else
        format.html { render :new }
        format.json { render json: @assessment.errors, status: :unprocessable_entity }
      end
    end
  end



  def set_client
    @assessment.client_id = params[:client_id]
  end

路线:

Rails.application.routes.draw do

resources :trainers
resources :clients
resources :assessments
root 'pages#home'

5 个答案:

答案 0 :(得分:1)

您的错误显示为:

  

未定义的方法`client_id ='为nil:NilClass

那是来自:

def set_client
  @assessment.client_id = params[:client_id]
end

由于您的new行动之前正在调用的内容:

before_action :set_client, only: [:new]

此时,@assessmentset_client为零,因为您尚未分配变量。因此错误。

它与没有通过的游行无关。

我的建议是,删除before_action并将new操作更改为:

def new
  @assessment = Assessment.new(client_id: params[:client_id])
end

答案 1 :(得分:1)

Assessment.find_by(client_id: params[:client_id])方法中set_client

答案 2 :(得分:1)

您正尝试在@assessment中设置client_id,并且在您尝试设置该变量时未定义该变量。

在行动(AKA方法)之前执行了

before_action的回调,如名称所示。

您应该删除before_action并在新方法中添加setter

def new
  @assessment = Assessment.new
  @assessment.client_id = params[:client_id]
end

答案 3 :(得分:1)

  • 1.在before_action中设置客户端
  • 2.无需在新方法中创建@assesment

更改如下

class AssessmentsController < ApplicationController
  before_action :set_assessment, only: [:show, :edit, :update, :destroy]
  before_action :set_client, only: [:new]

  def new
  end



 def create
    @assessment = Assessment.new(assessment_params)
    respond_to do |format|
      if @assessment.save
        format.html { redirect_to @assessment, notice: 'Assessment was successfully created.' }
        format.json { render :show, status: :created, location: @assessment }
      else
        format.html { render :new }
        format.json { render json: @assessment.errors, status: :unprocessable_entity }
      end
    end
  end



  def set_client
    @client_id = Client.find_by(params[:client_id])
  end
end

答案 4 :(得分:1)

未定义错误的主要原因是您将client_id传递给新方法但不传递给create方法。 我从你的问题中理解的是你想要给客户添加评估。

如果这是您的目标,请按以下步骤操作

1.在各个模型中创建关联。

在Client.rb中添加以下行

has_many: :assesments

并添加到Assement.rb

belongs_to: Client

2.现在更改ur routes.rb。

resources clients do
  resources assements do
  end
end 

3.现在通过执行此cmd 佣金路线来检查您的路线  现在你的路线应该是这样的

/clients/:client_id/assements/new(.:format)

4.现在您不需要手动传递客户端ID参数。

希望这可以帮助您解决问题。

这里有cmt ..