Ruby - 在函数括号

时间:2016-08-22 20:10:03

标签: ruby-on-rails ruby

我最近开始学习Ruby on Rails,习惯Ruby的语法真的很奇怪。

我决定使用可以放置的所有括号(我从其他语言中知道)并且卡住了:

test "invalid signup information" do
        get signup_path
        assert_no_difference("User.count", {
            user_params = { user: {
                name: "",
                email: "foo@invalid",
                password: "foo",
                password_confirmation: "bar"
            }}
            post(user_path, {params: user_params})
        })
    end

我想将一个块传递给assert_no_difference,不知怎的,它在我的测试中显示错误。在我放置了user_params的定义后,它开始显示它。至于我读了一些网站的语法还可以,那么可能会出现什么问题?

1 个答案:

答案 0 :(得分:5)

传递块有两种常规形式。长篇形式的方法是使用do ... end

assert_no_difference('User.count') do
  # ...
end

还有大括号版本:

assert_no_difference('User.count') {
  # ...
}

请注意,花括号样式通常保留用于单行操作,如下所示:

assert_no_difference('User.count') { post(...) }

对于多行,您通常希望使用do ... end,因为它更容易被发现。 在罗马时原则适用于此,所以你可能需要满足一些期望,以便以Ruby的方式做事。

你做错了是传递一个被认为是哈希的论证,但因为它包含任意无效的代码。与JavaScript不同,块是在函数调用的参数之外定义的。

清理代码会产生以下结果:

test "invalid signup information" do
  get signup_path

  assert_no_difference("User.count") do
    post(user_path,
      params: {
        user: {
          name: "",
          email: "foo@invalid",
          password: "foo",
          password_confirmation: "bar"
        }
      }
    )
  end
end

请注意,您可以提供内联参数,以及在方法调用中指定为最后一个参数的任何哈希样式参数不需要其花括号,它们是严格可选的,通常最好省略。