2016-08-22 7 views
1

最近Ruby on Railsを学び始めました。Rubyの構文に慣れるのは本当に変です。関数括弧内のRuby - パッシングブロック

私は置くことができると私は行き詰まって、すべての括弧(私は他の言語から知っていること)で行くことにしました:私はassert_no_differenceにブロックを渡したいと何とかそれが表示されている

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 

私のテスト中にエラーが出る。私はuser_paramsの定義をした後、それを表示し始めました。私はいくつかのウェブサイトを読む限り、構文はOKですので、何がうまくいかないでしょうか?

+0

質問をエラーメッセージで更新できますか? –

+0

'user_params = {}'と 'post(...) 'の間にカンマが必要です – Swards

答えて

5

ブロックを渡すための2つの一般的な形式があります。長い形式の方法が使用することですdo ... end

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

中括弧のバージョンもあります:

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

注中括弧のスタイルは、一般的のように、単一ライン操作のために予約されていることは、この:あなたは、一般的にそれの電子以来do ... endを使用したい複数行の場合

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

見つけよう。 The ローマにいるときはの原則が適用されるので、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