路由生成错误:在Minitest中创建操作

时间:2015-06-09 23:07:19

标签: ruby-on-rails routes params minitest

我目前正在为所有控制器编写功能测试。对于每一个,我都无法使创建操作起作用。当我运行rake测试时,我一直收到以下错误:

 ActionController::UrlGenerationError: No route matches {:action=>"create", :comment=>{:content=>"I'm a comment.", :product_id=>"685617403"}, :controller=>comments}

以下是我要测试的操作:

class CommentsController < ApplicationController
  before_action :authenticate_user!
  def create
    @product =Product.find(params[:product_id])
    @comment=Comment.create(params[:comment].permit(:content))
    @comment.user_id= current_user.id
    @comment.product_id= @product.id
    if @comment.save
      redirect_to product_path(@product)
    else
      render 'new'
    end
  end
end

这是路线:

POST     /products/:product_id/comments(.:format)          comments#create

以下是我的测试:

    def setup
    @user=users(:chris)
    @product=products(:banana)
  end

  test "should redirect destroy action if not signed in" do
    post :create, comment: { content: "I'm a comment.", product_id:@product.id}
    assert_redirected_to new_user_session_path
  end

我无法弄清楚我做错了什么。我相当肯定我正在传递正确的参数。我也曾尝试使用和没有user_id:参数,它仍然会抛出同样的错误。它在应用程序上运行良好,我在发出请求时在Web控制台中调用了params,它与我传递的内容相匹配。我唯一缺少的是:id但我假设在测试中创建注释时会分配。此外,没有唯一的约束可以阻止创建的注释有效。我的关联到位,当它在应用程序上运行时,它使用user_id和product_id保存到数据库。我错过了什么?

1 个答案:

答案 0 :(得分:0)

我认为您需要将product_id作为自己的第一级参数,以便路由正确匹配。所以试试这个:

post :create, product_id: @product.id, comment: { content: "I'm a comment.", product_id: @product.id }

请注意,在您的控制器操作中,您已经直接引用params[:product_id],但您没有引用params[:comment][:product_id]。然后,为了减少重复,您可以在控制器中将注释创建为该产品的子项:

@comment = @product.comments.create(other params...)

滑轨&#39;路由错误可能非常模糊且无益。 90%的时间错误归结为一些变化:ID不匹配或错误名称,零值等。