2011-08-27 497 views
5

作爲Ruby on Rails的新手,我明白「@」和「:」引用有不同的含義。我在SO中看到了this post,其中描述了一些差異。Ruby - 變量和@variable之間的區別

  1. @表示實例變量(例如,@my_selection)
  2. 表示別名(例如:my_selection)

我遇到了一個情況,我有一個標準MVC頁面,類似於我的web應用程序中的所有其他表單/頁面。

html.erb片斷

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

route.rb片斷

resources :my_selections 

當我試圖訪問這個網頁,我得到這個錯誤:

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> 

第16行是表單摘要顯示以上。

我在同一個網絡應用程序中的所有其他表單/頁面都以完全相同的方式設置,並且工作正常。但是,一旦我將erb格式引用更改爲:my_selection,此錯誤消失,我的頁面正常運行。

問題:

  1. 是我之間的差異的理解:my_selections和@my_selections是否正確?
  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)將生成提交到創建行動,如果該模型實例未保存,或將更新行動,如果該模型已經在您的數據庫退出表單。

不,我不知道@my_selection中是什麼,但無論它是什麼類似乎都沒有正確生成路線。

resources :my_selections 

會產生你會調用這樣的路線:

my_selections_path 

如何使你的表單生成my_selection_index_path路線我不知道,它真的取決於你的模型是什麼。

而當您傳遞一個符號,而沒有相應的ivar時,它會使用它作爲路徑生成的模型名稱。如果試圖調用my_selections_path,它會直接基於你傳入的符號來做正確的事情。

+0

我必須檢查一下我的模型在做什麼,但我絕對讚賞這個解釋。 – JW8

相關問題