首页 > 解决方案 > Rails - 三重嵌套路线上的 simple_form_for

问题描述

我知道,三重嵌套被看不起,但我试图弄清楚如何正确创建这个表单,但我被困住了。我有一个模型主题,其中有_many 问题,其中有_many Citations。我收到一条错误消息,提示没有路线匹配。

路由设置如下:

resources :topics do
  resources :questions do  
    resources :citations
  end
end

所有模型都正确设置了 has_many/belongs_to 关联。并且在主题和问题之间一切正常。

我使用以下内容(尝试)创建一个新的引文:

<%= link_to "Add a citation", new_topic_question_citation_path(@topic, @question.id) %>

然后构建一个表单:

<%= simple_form_for @citation, url: topic_question_citation_path(@topic.id, @question.id) do |f| ... %>

但我在表单上遇到以下错误:

No route matches {:action=>"show", :topic_id=>6, :controller=>"citations", 
:question_id=>84}, missing required keys: [:id]

在同一页面上,它显示:

Request
Parameters: 
{"topic_id"=>"topic1", "question_id"=>"84"}

对于我的 citation_controller,我有:

class CitationsController < ApplicationController

  def create
    @topic = Topic.find(params[:topic_id])
    @question = @topic.questions.find(params[:question_id])
    @citation = @question.citations.new(citation_params)
    @citation.user = current_user
    if @citation.save!
      flash[:notice] = "Your submission has been accepted and will be reviewed by a moderator."
      redirect_to topic_question_path(@topic, @question.id)
    else
      render :new
    end
  end

  def new
    @citation = Citation.new
    @topic = Topic.find(params[:topic_id])
    @question = Question.find(params[:question_id])
  end  

  def index
    @citations = Citation.all
  end

  def show
    authorize! :read, @citation
  end



  ...

end

这种格式适用于我所有其他嵌套两层的模型。这里出了什么问题,我该如何解决?

标签: ruby-on-rails

解决方案


没有路线匹配 {:action=>"show", :topic_id=>6, :controller=>"citations", :question_id=>84},缺少必需的键:[:id]

创建的路径助手citations应该是. 注意更改而不是.topic_question_citations_pathtopic_question_citation_pathcitationscitation

进行此更改以修复错误

<%= simple_form_for @citation, url: topic_question_citations_path(@topic.id, @question.id) do |f| ... %>

或者

它可以简单地写成

<%= simple_form_for [@topic, @question, @citation] do |f| %>

暗示:

始终运行rake routes以查看可用的路径助手。每个路径助手都将映射到某个controller#action. 因此,您可以通过将受人尊敬的可用路径助手与您正在使用的路径助手进行比较来修复此类错误。


推荐阅读