我试图将一个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'
答案 0 :(得分:1)
您的错误显示为:
未定义的方法`client_id ='为nil:NilClass
那是来自:
def set_client
@assessment.client_id = params[:client_id]
end
由于您的new
行动之前正在调用的内容:
before_action :set_client, only: [:new]
此时,@assessment
中set_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,并且在您尝试设置该变量时未定义该变量。
before_action
的回调,如名称所示。
您应该删除before_action
并在新方法中添加setter
def new
@assessment = Assessment.new
@assessment.client_id = params[:client_id]
end
答案 3 :(得分:1)
更改如下
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 ..