Parameters 在为Rails控制器方法编写测试时,如何将ID参数传递给show方法?

Parameters 在为Rails控制器方法编写测试时,如何将ID参数传递给show方法?,parameters,controller,ruby-on-rails-5,show,minitest,Parameters,Controller,Ruby On Rails 5,Show,Minitest,我使用的是Rails 5。我的控制器中有以下方法 class LinesController < ApplicationController ... def show @line = Line.find(params[:id]) end 但是当我运行测试时,我得到以下错误 Error: LinesControllerTest#test_get_show_page_with_valid_line_id: ActionController::UrlGenerati

我使用的是Rails 5。我的控制器中有以下方法

class LinesController < ApplicationController

    ...

  def show
    @line = Line.find(params[:id])
  end
但是当我运行测试时,我得到以下错误

Error:
LinesControllerTest#test_get_show_page_with_valid_line_id:
ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"lines"} missing required keys: [:id]
    test/controllers/lines_controller_test.rb:16:in `block in <class:LinesControllerTest>'


bin/rails test test/controllers/lines_controller_test.rb:14
编辑2:根据给出的答案,我将我的方法改为

  test "get show page with valid line id" do
    param_line = lines(:one)
    assert_not_nil param_line

    puts "id: #{param_line.id}"
    get line_path, id: param_line.id
    line = assigns(:line)
    assert_equal param_line.id, line.id
    assert_response :success
  end
并在运行测试时出现此错误

# Running:

...id: 1
E

Error:
LinesControllerTest#test_get_show_page_with_valid_line_id:
ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"lines"} missing required keys: [:id]
    test/controllers/lines_controller_test.rb:21:in `block in <class:LinesControllerTest>'


bin/rails test test/controllers/lines_controller_test.rb:16
#运行:
…id:1
E
错误:
LinesControllerTest#test(测试)获取(显示)页面(带有(有效)行(id):
ActionController::UrlGenerationError:没有路由匹配{:action=>“show”,:controller=>“lines”}缺少必需的键:[:id]
测试/控制器/线路\u控制器\u测试.rb:21:in'block in'
箱子/轨道测试/控制器/线路\控制器\测试。rb:16

对我来说,似乎应该是

get line_path(test_line_id)
在你的测试中

说明: 无需将其包装在
params
params
只是内部哈希轨道提供给控制器操作,用于读取随请求传入的参数。并且传递给路径生成器的第一个参数将始终映射到params中的
id

因此,您的代码将传入
params[:params]
–由于我们有强参数,
params[:params]
参数将被过滤掉(您应该在日志中看到有关此的警告)


此外,正如我在上面的评论和@NicholasMartinez指出的,您应该使用
\u path
而不是
\u url
,除非您明确需要绝对路径(如在应用程序外部使用的链接中,例如在电子邮件中).

routes.rb文件看起来像什么?rake routes返回什么?我认为这与您传递的参数无关,它与您调用路由的方式有关。您好,我编辑了我的问题,将“rake routes”包括在内“输出。您使用行\ url而不是行\路径有什么原因吗?”?通常,如果您在应用程序之外(例如在电子邮件中),您只需要使用绝对路径(line_url)。可能与你的问题无关——只是好奇而已。我相信@morgler是正确的。您获取从
rake routes
返回中输出的路由名称,并将其附加到
\u path
而不是
\u url
。您还可以执行类似于
get'/lines/:id(:format)
的操作,并显式地到达终点。嘿,也许就是这么简单!我会试试莫格勒的答案,看看这是否解决了问题。我相信你的
get line\u url
不正确。在上面的评论中,您提到的应该是
get line\u path
,这是正确的。感谢@NicholasMartinez指出这一点!更新了我的答案。@morgler,我试了一下你的答案(很确定我已经完成了你的要求)。我在问题中包括了测试和错误。错误为“ActionController::UrlGenerationError:没有路由匹配{:action=>“show”,:controller=>“lines”}。缺少必需的键:[:id]”。那个“puts”语句返回“1”——虽然可能那个对象并没有ID,但看起来确实有ID。很抱歉我的代码太复杂了。当然,这应该写成
get line\u path(test\u line\u id)
。我太累了——我会在回答中解决它;)。它解决了你的问题吗?它解决了!非常感谢。
# Running:

...id: 1
E

Error:
LinesControllerTest#test_get_show_page_with_valid_line_id:
ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"lines"} missing required keys: [:id]
    test/controllers/lines_controller_test.rb:21:in `block in <class:LinesControllerTest>'


bin/rails test test/controllers/lines_controller_test.rb:16
get line_path(test_line_id)