Rails-三重嵌套路线上的simple_form_for

时间:2018-10-23 16:51:05

标签: ruby-on-rails

我知道,三重嵌套被忽略了,但是我试图弄清楚如何正确地创建此表单,而被困住了。我有一个主题为has_many的模型,其中有has_many个引用。我收到一条错误消息,说没有路线匹配。

路由设置如下:

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

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

1 个答案:

答案 0 :(得分:0)

  

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

用于创建citations 路径助手 应该是topic_question_citations_path而不是topic_question_citation_path。注意更改citations而不是citation

进行此更改以纠正错误

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

OR

它可以简单地写为

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

提示:

始终运行rake routes来查看 可用的路径助手 。每个路径助手将被映射到特定的controller#action。因此,您可以通过将受尊重的可用路径助手与您正在使用的助手进行比较来解决此类错误。