Когда использовать @ в Rails View, а когда использовать символ?
-
10-07-2019 - |
Вопрос
<% 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 %>
В приведенном выше примере, который работает, я должен был сказать @ album.id в form_tag, но в текстовом поле я должен был сказать: album. Я постоянно путаю их в своих взглядах и никогда не знаю, использовать ли знак @ или символ. Есть ли простое правило, которое может дать понять, что и когда использовать?
Решение
Я собираюсь остановиться здесь на некоторое время, но потерпите меня.
Во-первых, я рекомендую вам использовать RESTful-маршрутизацию , поскольку это дает вам доступ к некоторым из Rails лучшие методы и операции, такие как возможность делать:
form_for(@album) do |f|
и заставить его работать, куда вы хотите пойти, основываясь на состоянии #new_record?
этого объекта. Р>
Во-вторых, с новым form_for
вы сможете высушить ваши взгляды, выполнив:
<%= f.text_field :title %>
вместо:
<%= text_field :album, :title %>
И, наконец, объяснение, почему переменная определяется со знаком @ перед ней в Rails, также известной как «переменные экземпляра»:
Когда вы определяете переменную экземпляра в Rails, она доступна внутри этого экземпляра для всего запроса, где " экземпляр " это цепочка методов ActionController
и ActionView
, которые вызываются для выполнения всего рендеринга и так далее. Определение его в качестве переменной экземпляра сделает его доступным в вашем контроллере, любом методе, который вы вызываете после определения его в контроллере, ваших помощниках, ваших представлениях и частичках, представленных вашими контроллерами, помощниками или представлениями. Р>
По сути, он существует для всего запроса, но недоступен внутри вашей модели.
Другими спецификациями переменных являются переменные класса ( @@ some_useful_thing = 1
) и глобальные переменные ( $ some_other_useful_thing = 1
) и константы ( ALL_IN_UP_CASE = 1 код>). Р>
Другие советы
Символ @ перед именем переменной относится к переменной экземпляра в текущем классе. Префикс: (двоеточие) создает символ. В вашем примере @ album.id
отправляет идентификатор переменной экземпляра @album
в form_tag
, позволяя form_tag
для чтения этого объекта из базы данных и заполнения полей формы соответствующими данными из этого объекта. Символы, которые вы передаете в методах text_field
, - это то, что form_tag
использует для доступа к определенным свойствам объекта, который он создает из базы данных. Затем он помещает значения этих свойств в создаваемые текстовые поля.