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 以获得完整指南。