Dúvida com sintaxe ao usar hashes ... ou oq eu acho que são hashes

Olá pessoal!
Estou seguindo o livro head first rails e em um dos capítulos me é apresentada a seguinte sintaxe
render :partial => 'subform', :locals => {:variable => @other_variable }

Já tinha me deparado com sintaxes parecidas nos capítulos anteriores mas até então fui seguindo em frente. Agora eu gostaria de entender realmente o que estou fazendo aqui pois até agora não consegui entender.

Minha dúvida não é em relação as variáveis ou aos símbolos e sim ao hash, pelo que entendi é assim que defino um hash:

mas se a sintaxe é essa, por que isso não está entre chaves?

pior ainda, por que não funciona quando eu adiciono as chaves?
e isso?

pra mim deveria ser um hash onde a chave é :locals e o valor é outro hash, mas se eu escrever dessa forma também não funciona ?

Não entendi essa construção, poderiam me explicar? já verifiquei o capítulo de hashes do livro ?The Ruby way? mas não consegui sanar minha dúvida.

Obrigado!

Como vai FieroddPJ? Tudo em ordem?

Uma característica bastante marcante da linguagem Ruby são os “sintaxes sugares” prá todo lado. Assim como o parêntese é opcional na chamada ao método render do exemplo que você apresentou, as chaves também são opcionais para a criação de um hash:

h = Hash.new h[:partial] = "subform"

# ruby 1.9: h = { partial: "subform" }

As três formas acima criam um hash com um símbolo “:partial” como chave e a string “subform” como valor.

Além disso, se um método receber um hash como último parâmetro, então as chaves são opcionais, veja esse exemplo:

[code]def ultimo_sera_hash(a, b, hash)
puts a
puts b
p hash
end

ultimo_sera_hash(“1”, “2”, :partial => ‘subform’)

o resultado da execução será:

1
2
{:partial=>“subform”}
[/code]

Vale lembrar que, como os parênteses são opcionais para a invocação de um método, poderíamos usar a seguinte sintaxe:

O Rails usa bastante dessa possibilidade para oferecer métodos que recebem apenas um único parâmetro (logo, esse cara é o primeiro e último parâmetro do método). No caso do exemplo que você citou, o método render recebe um hash, com duas chaves: :partial apontando para uma string e :locals apontando para outro hash.

Ajudou? Qualquer dúvida é só dizer!

Entendi Ricardo, obrigado!
Os sintaxe suggars complicaram um pouco a minha vida …

Após a sua explicação testei essa sintaxe

Dessa forma funciona e faz sentido pra mim!

Vou seguir em frente no head first, mas é extremamente contra-intuitivo aprender rails (o framework) sem ter uma boa base de ruby (a linguagem), não farei isso novamente, fica a dica pra quem quiser começar a estudar RoR.

Mais uma vez obrigado!