Quando usar @ numa Rails Ver e quando usar um símbolo?
-
10-07-2019 - |
Pergunta
<% form_tag(:action=>'update', :id=>@album.id) do %>
Title: <%= text_field(:album, :title) %><br>
Artist: <%= text_field(:album, :artist) %><br>
Genre: <%= text_field(:album, :genre) %><br>
Release Date: <%= datetime_select(:album, :release_date, :start_year=>1960) %><br>
<%= submit_tag("Update") %>
<% end %>
No exemplo acima, o que funciona, eu tinha a dizer @ album.id na form_tag mas no text_field eu tinha a dizer: álbum. Eu continuo confundir estes em meus pontos de vista e nunca realmente saber se a utilização de um sinal @ ou um símbolo. Existe uma regra simples que poderia torná-lo claro o que para usar quando?
Solução
Vou sair pela tangente aqui por um momento, mas urso comigo.
Em primeiro lugar, eu recomendo que você use RESTful roteamento pois isso lhe dá acesso a algumas das Rails melhores métodos e operações tais como ser capaz de fazer:
form_for(@album) do |f|
e tê-lo trabalhar para fora onde você quer ir com base no estado #new_record?
desse objeto.
Em segundo lugar, com o novo form_for
no lugar, você vai ser capaz de secar seus pontos de vista fazendo:
<%= f.text_field :title %>
em vez de:
<%= text_field :album, :title %>
E, finalmente, a explicação de por que uma variável é definida com um símbolo @ antes que em Rails, também conhecido como "variáveis ??de instância":
Quando você define uma variável de instância em Rails está disponível dentro dessa instância para o pedido na totalidade onde o "exemplo" é o ActionController
e ActionView
cadeia de métodos que são chamados a fazer todo o processamento e assim por diante para você. Definindo-a como uma variável de instância irá torná-lo disponível em seu controlador, qualquer método que você chamar após defini-la no controlador, seus ajudantes, seus pontos de vista e as parciais prestados a partir do seu controladores, ajudantes ou pontos de vista.
Basicamente, é em torno de todo o pedido, mas não é acessível dentro do seu modelo.
Outras especificações de variáveis ??são variáveis ??de classe (@@some_useful_thing = 1
) e variáveis ??globais ($some_other_useful_thing = 1
) e constantes (ALL_IN_UP_CASE = 1
).
Outras dicas
O símbolo @ antes de um nome de variável refere-se a uma variável de instância na classe atual. A: prefixo (cólon) cria um símbolo. No seu exemplo, @album.id
está enviando o ID da variável de instância @album
para form_tag
, permitindo form_tag
para ler no objeto do banco de dados e preencher os campos do formulário com os dados apropriados a partir desse objeto. Os símbolos que passam nos métodos text_field
são o que form_tag
usos para propriedades de acesso específicas sobre o objeto que cria a partir do banco de dados. Em seguida, ele coloca os valores dessas propriedades nos campos de texto que gera.