Railsビューで@を使用するタイミングとシンボルを使用するタイミング
-
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 %>
動作する上記の例では、form_tagで@ album.idを指定する必要がありましたが、text_fieldでは: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
インスタンス変数のIDを form_tag
に送信し、 form_tag
データベースからそのオブジェクトを読み込み、そのオブジェクトの適切なデータをフォームフィールドに入力します。 text_field
メソッドで渡すシンボルは、 form_tag
がデータベースから作成したオブジェクトの特定のプロパティにアクセスするために使用するものです。次に、それらのプロパティの値を生成するテキストフィールドに配置します。