5
<% 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中我不得不說:專輯。我一直在我的觀點中混淆這些,並且永遠不知道是否使用@符號或符號。有一個簡單的規則,可以明確什麼時候使用?何時在Rails視圖中使用@以及何時使用符號?

回答

14

我要在這裏切一會兒,但忍耐着我。

首先,我建議您使用RESTful routing,因爲這使您可以訪問一些Rails的更好的方法和操作,如能夠做的:

form_for(@album) do |f| 

,並讓它在哪裏工作,你想要去的基礎在該對象的#new_record?狀態。

其次,在地方新form_for,你就可以做幹起來你的觀點:中

<%= f.text_field :title %> 

代替:

<%= text_field :album, :title %> 

最後的一個原因的解釋變量在Rails中定義爲@符號,也稱爲「實例變量」:

當您在Rails中定義實例變量時,實例「,其中」實例「是ActionControllerActionView被調用以執行所有呈現等的方法鏈。將其定義爲實例變量將使其在控制器中可用,在控制器中定義它之後調用的任何方法,助手,視圖以及從控制器,助手或視圖呈現的部分。

基本上,它是針對整個請求的,但無法在您的模型中訪問。其他變量規格是類變量(@@some_useful_thing = 1)和全局變量($some_other_useful_thing = 1)和常量(ALL_IN_UP_CASE = 1)。其他變量規格是類變量(@@some_useful_thing = 1)和全局變量($some_other_useful_thing = 1)和常量(ALL_IN_UP_CASE = 1)。

+0

謝謝。我必須考慮REST。在Rails 1.1.6上學習一些教程,但還沒有完成。因此,對於form_for,text_field(:album,:title)不是必需的,因爲:專輯名稱已經知道,因爲f.text_field是您在do | f |中引用的表單的一部分。我想我明白了。謝謝。 – 2009-05-08 05:49:47

6

變量名前面的@符號引用當前類中的實例變量。 :(冒號)前綴創建一個符號。在您的示例中,@album.id正在將@album實例變量的ID發送到form_tag,允許form_tag從數據庫中讀取該對象,並使用該對象的適當數據填充表單字段。您在text_field方法中傳遞的符號是form_tag用來訪問它從數據庫創建的對象上的特定屬性。然後將這些屬性的值放入它生成的文本字段中。

+0

所以text_field不知道這張專輯是因爲它是由form_tag所包含的,而form_tag已經有了它的引用。正如雷達所說,form_for是解決這個重複問題的方法。我想我現在理解這一點。感謝您的解釋。 – 2009-05-08 05:51:51

相關問題