2011-08-27 14 views
5

Ruby on Railsの初心者では、 "@"と ":"の参照には異なる意味があることを理解しています。 SOの中でthis postが見えましたが、これはいくつかの違いを説明しています。 @Ruby - 変数と@variableの違い

  1. インスタンス変数(例えば、@my_selection)
  2. を示しますは(例えば:my_selection)の別名を示し

私は標準を持っていたような状況に遭遇しましたMVCページ、私のwebappの他のすべてのフォーム/ページに似ています。

NoMethodError in selections#create 
Showing C:/somedir/myapp/app/views/my_selections/index.html.erb where line #16 raised: 
undefined method `my_selection_index_path' for #<#<Class:0x1197e5676>:0x25439c3b> 

html.erbは

<%= form_for @my_selection do |f| %> 

route.rbが、私はこのページにアクセスしようとすると、私はこのエラーを取得する

resources :my_selections 

スニペットスニペット16行目はスニペットフォームです上記のn。

同じWebアプリケーション内の他のすべてのフォーム/ページは全く同じ方法で設定され、うまく動作しています。しかし、erbフォームリファレンスを:my_selectionに変更すると、このエラーは消えて、ページは正常に動作しました。

質問:正しいmy_selectionsと@my_selections:

  1. は違いの私の理解ですか?
  2. なぜ切り替えるのですか?my_selectionは私の元のエラーを解決しますか?

答えて

13

Is my understanding of the difference between :my_selections and @my_selections correct?

いや:(

:は、本質的に何の別名、シンボルを示していない。それは、多くの場合、何かを表現するための名前として使用されている不変の文字列、のようなものです。

Rails apiがインスタンス変数の代わりにシンボルを受け入れる場所では、内部的に実際にはこれを実行しています:

self.instance_variable_get "@#{my_symbol}" 

実際に要求されたインスタンス変数の値を返します。

シンボルがインスタンス変数に対応すると思う唯一の理由は、使用しているAPIを駆動するコードがそのように機能するためです。あなたのためのフレームワークがなければ、まったく相関はありません。

Why would switching to :my_selection resolve my original error?

for_form(model_instance)モデルはすでにあなたのDBに終了している場合はモデルインスタンスが保存されていない、または更新アクションにある場合は作成アクションに送信するフォームを生成します。

いいえ何が@my_selectionにあるのかわかりませんが、どのクラスであってもルートを正しく生成していないようです。

resources :my_selections 

は、あなたがこのように呼び出しますルートを生成します:

my_selections_path 

フォームは、私はわからないんだけど、それは本当にあなたのモデルが何であるかに依存しmy_selection_index_pathのルートを生成している方法。

代わりにシンボルを渡し、対応するivarがない場合は、それをルート生成のモデル名として使用します。あなたが渡したシンボルに直接基づいているmy_selections_pathを呼び出そうとすると、正しいことが起こります。

+0

私のモデルが何をしているのかチェックする必要がありますが、 – JW8

関連する問題