2016-08-22 39 views
1

我最近开始学习Ruby on Rails,习惯Ruby的语法真的很奇怪。Ruby - 函数括号内的传递块

我决定与所有的括号去(我是从其他语言知道),可以放置我卡住了:

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

我想块传递到assert_no_difference,不管怎样它显示我在测试期间出错。它在我放置user_params的定义后开始显示。据我阅读一些网站的语法是好的,那么可能会出错?

+0

你可以用错误信息更新问题吗? –

+0

您需要在'user_params = {}'和'post(...)' – Swards

回答

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: "[email protected]", 
      password: "foo", 
      password_confirmation: "bar" 
     } 
     } 
    ) 
    end 
end 

注意您可以在线提供的参数,以及指定为一个方法调用的最后一个参数并不需要它的花括号任何散列式的参数,他们”严格可选,通常最好省略。

+0

之间逗号所以问题出在块而不是关联数组上,对吗?我是否也可以在功能括号内包含该块? – Ancinek

+0

虽然在技术上是一个“关联数组”或“字典”,但在Ruby中它们被称为哈希。问题主要在于该块,是的。我已经添加了代码的清理版本。 – tadman

+1

从Objective C/Swift转换到Ruby已经有一段时间了。无论如何,很好的解释性答案!谢谢。 我将稍微改变这个问题的标题,以便像我这样的人可以更轻松地找到它! – Ancinek