2013-05-14 92 views
0

我肯定會在RoR的某個地方。只是想澄清有關循環的一些事情。Ruby on Rails。瞭解循環

我已經創建了一個'inputs'控制器,它包含讓用戶創建,讀取,更新和刪除數據庫條目的方法。

我也有一個'輸入'視圖呈現html前端。在視圖中是以下循環:

<table> 
<% @inputs.each do |input| %> 
    <tr> 
    <td><%= input.title %></td> 
    <td><%= input.content %></td> 
    <td><%= link_to 'Show', input %></td> 
    <td><%= link_to 'Edit', edit_input_path(input) %></td> 
    <td><%= link_to 'Destroy', input, method: :delete, data: { confirm: 'Are you sure?' } %> 
</td> 
    </tr> 
<% end %> 
</table> 

我明白循環是如何在概念上工作的,但我對此有點失落。

我認爲@inputs'指向代碼'(更好的表達方式,請?)朝向循環所用方法所在的輸入控制器。

在輸入控制器中,確實有'編輯','創建','顯示'和'銷燬'等方法。

但控制器中沒有'標題'或'內容'方法!他們來自哪裏?

而且,說實話,我不明白

<% @inputs.each do |input| %> 

非常好。

這是我想了解:

@inputs =去輸入控制器

。每=呼叫輸入控制器上的每個方法。 (每個方法在哪裏定義?它甚至意味着什麼,在控制器上調用每個方法?)

do |輸入|無論控制器上的每一個操作如何,它都會生成一個名爲「輸入」的對象。

現在,對象的'輸入'確實包含諸如標題和內容之類的方法,但這些方法來自哪裏?它們在控制器中幾乎沒有任何地方!

無論如何,非常感謝。

回答

2

當您使用@inputs您的視圖模板內爲你在上面的代碼所示,視圖模板使用可變@inputs實例已控制器的行動,呈現視圖模板中定義。

換句話說,舉個例子,假設您的InputsController有一個名爲index的方法。在您的視圖文件夾中,您有一個名爲index.html.erb的相應視圖模板。

# Inside app/controllers/inputs_controller.rb 
def index 
    @inputs = Input.all 
end 

# Inside app/views/inputs/index.html.erb 
<table> 
<% @inputs.each do |input| %> 
    <tr> 
    <td><%= input.title %></td> 
    <td><%= input.content %></td> 
    <td><%= link_to 'Show', input %></td> 
    <td><%= link_to 'Edit', edit_input_path(input) %></td> 
    <td><%= link_to 'Destroy', input, method: :delete, data: { confirm: 'Are you sure?' } %> 
</td> 
    </tr> 
<% end %> 
</table> 

index方法被調用時,Rails將默認,查找具有相同名稱的一個視圖模板作爲被調用的方法;也就是說,它將搜索名爲index.html.erb的視圖模板。

使用我在這裏給出的例子,在視圖模板中使用的@inputs已經從控制器調用的index動作實例化。

此外,你可以從@inputs變量的實例見:

@inputs = Input.all 

@inputs是引用對象的集合,從您的數據庫的變量。換句話說,在你的視圖模板內循環,在本節:

<% @inputs.each do |input| %> 

每個|input|是包含在@inputs集合內的一個對象的引用,並反過來,每個對象對應一個數據庫對象(即輸入模型)。這就是爲什麼每個input都有稱爲titlecontent的屬性的原因,因爲這些屬性可能在數據庫遷移中定義爲Input表的列。

0

鑑於@inputs是項的集合(一個陣列,例如),

.each do並迭代上的每個項目。

| input |說:「把每個項目放在變量輸入中,這樣我就可以在塊中使用它..結束

@items是由控制器設置的變量,如果你的是空的(就像你使用腳手架一樣) Ruby on Rails的做的工作適合你,就好像你在你的控制器有:

def index 
    @inputs = Input.all 
end 
0

@inputs是被實例化的控制器一些objects集合的實例變量作爲一個實例變量,它存在於你的關聯視圖

#each是一個Ruby迭代器,它遍歷數組,p一次一個元素,在|input|這裏。因此,在每次迭代時,|input|將成爲@inputs陣列的下一個對象。

現在請記住,inputobject。 Rails中的一個對象有幾個屬性。這裏title,content是可能/可能不包含某些值的模型屬性/字段。例如, A User模型可以包含如下屬性: - nameemail_address

newcreateeditupdateindexshowdestroy所在的控制器REST式路線中,每個執行動作,並且每個具有相關聯的視圖。

link_to是一個ActionView幫助程序,用於在模板中插入鏈接。
link_to顯示, input帶您到控制器的show操作。
link_to 'Edit', edit_input_path(input)將帶您進入控制器的edit操作。
等等..這些是你的控制器的動作/方法。

希望它有幫助。 :)