nested_scaffold URLGenerationError
nested_scaffold URLGenerationError
我的错误是:
No route matches {:action=>"new", :advertiser_id=>"2",
:controller=>"analyses", :experiment_id=>nil} missing required keys:
[:experiment_id]
错误发生在
app/views/analyses/index.html.erb:29:in
`_app_views_analyses_index_html_erb___267178907_46340268'
指向我index.html.erb
中的这段代码
<%= link_to 'New Analysis', new_advertiser_experiment_analysis_path(params[:experiment_id]) %>
该错误还显示传递的参数为:
Parameters: {"advertiser_id"=>"9", "experiment_id"=>"2"}
不知道为什么它告诉我它不知道 experiment_id。
这是我的分析控制器
class AnalysesController < ApplicationController
before_action :set_analyses
before_action :set_analysis, only: [:show, :edit, :update, :destroy]
# GET experiments/1/analyses
def index
@analyses = @experiment.analyses
end
# GET experiments/1/analyses/1
def show
end
# GET experiments/1/analyses/new
def new
@analysis = @experiment.analyses.build
end
# GET experiments/1/analyses/1/edit
def edit
end
# POST experiments/1/analyses
def create
@analysis = @experiment.analyses.build(analysis_params)
if @analysis.save
redirect_to([@analysis.experiment, @analysis], notice: 'Analysis was successfully created.')
else
render action: 'new'
end
end
# PUT experiments/1/analyses/1
def update
if @analysis.update_attributes(analysis_params)
redirect_to([@analysis.experiment, @analysis], notice: 'Analysis was successfully updated.')
else
render action: 'edit'
end
end
# DELETE experiments/1/analyses/1
def destroy
@analysis.destroy
redirect_to experiment_analyses_url(@experiment)
end
private
# Use callbacks to share common setup or constraints between actions.
def set_analyses
@experiment = Experiment.find(params[:experiment_id])
end
def set_analysis
@analysis = @experiment.analyses.find(params[:id])
end
# Only allow a trusted parameter "white list" through.
def analysis_params
params.require(:analysis).permit(:conversion, :aov, :win_loss, :notes)
end
end
从您当前的代码可以看出,您对资源进行了三层嵌套。例如:
resources :advertiser do
resources :experiment do
resources :analysis
end
end
所以路由 new_advertiser_experiment_analysis_path
需要两个 ID。一个用于 advertiser
,另一个用于 experiment
,所以您只传递一个 id,它被认为是 advertiser_id
(如果哈希没有明确提及,它遵循我们提供 id 的顺序)所以它为 experiment_id
获取 nil 这就是它失败的原因。
所以你需要
<%= link_to 'New Analysis', new_advertiser_experiment_analysis_path(advertiser_id: params[:advertiser_id] , experiment_id: params[:experiment_id]) %>
查看 Rails Nested Routing 以获得完整指南。
我的错误是:
No route matches {:action=>"new", :advertiser_id=>"2", :controller=>"analyses", :experiment_id=>nil} missing required keys: [:experiment_id]
错误发生在
app/views/analyses/index.html.erb:29:in `_app_views_analyses_index_html_erb___267178907_46340268'
指向我index.html.erb
中的这段代码<%= link_to 'New Analysis', new_advertiser_experiment_analysis_path(params[:experiment_id]) %>
该错误还显示传递的参数为:
Parameters: {"advertiser_id"=>"9", "experiment_id"=>"2"}
不知道为什么它告诉我它不知道 experiment_id。
这是我的分析控制器
class AnalysesController < ApplicationController
before_action :set_analyses
before_action :set_analysis, only: [:show, :edit, :update, :destroy]
# GET experiments/1/analyses
def index
@analyses = @experiment.analyses
end
# GET experiments/1/analyses/1
def show
end
# GET experiments/1/analyses/new
def new
@analysis = @experiment.analyses.build
end
# GET experiments/1/analyses/1/edit
def edit
end
# POST experiments/1/analyses
def create
@analysis = @experiment.analyses.build(analysis_params)
if @analysis.save
redirect_to([@analysis.experiment, @analysis], notice: 'Analysis was successfully created.')
else
render action: 'new'
end
end
# PUT experiments/1/analyses/1
def update
if @analysis.update_attributes(analysis_params)
redirect_to([@analysis.experiment, @analysis], notice: 'Analysis was successfully updated.')
else
render action: 'edit'
end
end
# DELETE experiments/1/analyses/1
def destroy
@analysis.destroy
redirect_to experiment_analyses_url(@experiment)
end
private
# Use callbacks to share common setup or constraints between actions.
def set_analyses
@experiment = Experiment.find(params[:experiment_id])
end
def set_analysis
@analysis = @experiment.analyses.find(params[:id])
end
# Only allow a trusted parameter "white list" through.
def analysis_params
params.require(:analysis).permit(:conversion, :aov, :win_loss, :notes)
end
end
从您当前的代码可以看出,您对资源进行了三层嵌套。例如:
resources :advertiser do
resources :experiment do
resources :analysis
end
end
所以路由 new_advertiser_experiment_analysis_path
需要两个 ID。一个用于 advertiser
,另一个用于 experiment
,所以您只传递一个 id,它被认为是 advertiser_id
(如果哈希没有明确提及,它遵循我们提供 id 的顺序)所以它为 experiment_id
获取 nil 这就是它失败的原因。
所以你需要
<%= link_to 'New Analysis', new_advertiser_experiment_analysis_path(advertiser_id: params[:advertiser_id] , experiment_id: params[:experiment_id]) %>
查看 Rails Nested Routing 以获得完整指南。