gpt4 book ai didi

ruby-on-rails - Ruby - 在函数括号内传递 block

转载 作者:数据小太阳 更新时间:2023-10-29 08:30:31 24 4
gpt4 key购买 nike

我最近开始学习 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

我想将一个 block 传递到 assert_no_difference 中,但它在我的测试期间以某种方式向我显示错误。它在我放置 user_params 的定义后开始显示。就我阅读的一些网站而言,语法没问题,那么可能出了什么问题?

最佳答案

有两种传递 block 的一般形式。长格式的方法是使用do ... end:

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

还有大括号版本:

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

注意花括号样式一般是为单行操作保留的,像这样:

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

对于多行,您通常希望使用 do...end 因为它更容易被发现。 When in Rome 原则适用于此,因此您可能需要放弃一些期望才能以 Ruby 方式做事。

您做错的是传递了一个假定为哈希的参数,但它包含无效的任意代码。与 JavaScript 不同, block 是在函数调用的参数之外定义的。

清理你的代码会产生这个:

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

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

关于ruby-on-rails - Ruby - 在函数括号内传递 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39087898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com