2016-08-22 2 views
1

Ich habe vor kurzem begonnen, Ruby on Rails zu lernen, und es ist wirklich seltsam, sich an die Syntax von Ruby zu gewöhnen.Ruby - Passing Block in der Funktion Klammer

entschied ich mich, mit all den Klammern zu gehen (die ich aus anderen Sprachen kennen), die platziert werden können, und ich blieb stecken:

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 

ich einen Block in die assert_no_difference übergeben wollen und irgendwie ist es zeigt mir ein Fehler während meiner Tests. Es begann es zu zeigen, nachdem ich die Definition von user_params platziert habe. Soweit ich einige Websites gelesen habe, ist die Syntax in Ordnung, was könnte also schief gehen?

+0

Können Sie die Frage mit der Fehlermeldung aktualisieren? –

+0

Sie brauchen ein Komma zwischen 'user_params = {}' und 'post (...)' – Swards

Antwort

5

Es gibt zwei allgemeine Formen für die Weitergabe in Blöcken. Die Langform Weg ist do ... verwenden end:

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

Es gibt auch die geschweifte Klammer Version:

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

Beachten Sie, dass die geschweifte Klammer Stil im Allgemeinen für Einleitungs-Operationen reserviert ist, wie dies:

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

Für mehrzeiligen möchten Sie in der Regel do ... end da es E verwenden, asier zu erkennen. Die Wenn in Rom Prinzip gilt hier, so müssen Sie möglicherweise einige Ihrer Erwartungen zu vergießen, um die Dinge auf Ruby Weise zu tun.

Was Sie falsch machen, ist die Übergabe eines Arguments, das vermutlich ein Hash ist, aber weil es willkürlichen Code enthält, der ungültig ist. Im Gegensatz zu JavaScript ist der Block außerhalb der Argumente zum Funktionsaufruf definiert.

Code Aufräumen ergibt dies:

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 

Hinweis Sie die Argumente Inline liefern können, sowie alle Hash-Stil Argumente als letztes Argument in einem Methodenaufruf angegeben wurde, nicht seine geschweiften Klammern müssen, sie‘ Re streng optional und in der Regel am besten weggelassen.

+0

Also ist das Problem mit dem Block, und nicht das assoziative Array, richtig? Kann ich den Block auch in die Funktionsklammer einschließen? – Ancinek

+0

Technisch ein "assoziatives Array" oder "Wörterbuch", werden sie in Ruby Hashes genannt. Das Problem liegt hauptsächlich beim Block, ja. Ich habe eine aufgeräumte Version Ihres Codes hinzugefügt. – tadman

+1

Es wird ein schwerer Weg sein, für einige Zeit von Objective C/Swift nach Ruby zu wechseln. Wie auch immer, großartige erklärende Antwort! Vielen Dank. Ich werde den Titel dieser Frage ein wenig ändern, damit andere wie ich es einfacher finden können! – Ancinek