2012-09-28 274 views
0

我被給了這個ruby代碼來概述。我對Ruby on Rails仍然陌生。我來自java背景。Ruby On Rails方法澄清

在User.rb

def last_name=name 
    require 'debugger'; debugger 
    self[:last_name] = name 
    end 

,並告訴我,這是一個setter方法。他們告訴我,這個在這條線的「形式」執行:

<%= f.label :last_name%> 
<%= f.text_field :last_name %> 

好的。有人可以澄清這個荒謬的語法是如何有效的嗎?

1)「User」類的實例從未初始化。該方法甚至被稱爲?

2)變量「name」來自哪裏?它的價值是什麼? (變量名稱在其他地方被調用)這個語法代表什麼? 「def last_name = name」??向該方法傳遞一個尚未初始化的變量?這是另一種語法的捷徑,只是爲了節省輸入2個符號?

3)如何在表單中調用此方法?我沒有看到一個「User.last_name(」大衛「)或任何類似。

有人能澄清這些代碼段嗎? 而且請不要帖子的鏈接補習或其他任何東西,只是澄清這一段代碼

+0

作業?儘管有你的要求,但我不得不建議你閱讀Rails和Ruby的介紹。 – InternetSeriousBusiness

+0

不,它不是作業 –

回答

1

代碼:由默認軌模板引擎使用

<%= f.label :last_name%> 
<%= f.text_field :last_name %> 

..是。這是查看代碼。

1)當提交表單時,用戶實例可能被初始化並填充。

表單操作對應於適當的控制器操作,該操作可能接受:last_name作爲參數。提交表單時,控制器操作可能會實例化用戶實例。然而,如果沒有更多的代碼,我不能100%確定你的應用程序就是這種情況。

2)變量name來自last_name方法接受的論點。

也許,以幫助您瞭解的方法,讓我們把它改寫:

def last_name= (name) 
    require 'debugger'; debugger 
    self[:last_name] = name 
end 

無論last_name=('John Doe')last_name = 'John Doe'將執行此方法。

3)我覺得我以前的描述應該幫助你理解這一點..

+0

謝謝,現在它是有道理的。那麼'def last_name(name)...'是什麼呢?它應該做同樣的權利?但它不會在我嘗試 –

+0

這可能是最簡單的考慮ruby函數調用的方式,它包含一個名稱和一個操作符。將'='符號想象成一個運算符,並將'def last_name(name)'作爲一個沒有運算符定義的方法來定義一個作爲'last_name('John Doe')'執行的方法。然後,Ruby將該符號(名稱)的'='操作映射到該方法。你應該閱讀這篇簡短的文章:http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ –

0
  1. MVC。在操作新被創建並分配給@user,這是將被用於表單的用戶的一個新實例。

  2. 名字來源於方法聲明def last_name=name

  3. 表單助手在將值賦給該變量並使用setter來完成時會執行last_name = name。編輯對象時,它將使用getter在文本字段中顯示其值。你描述

+0

「窗體幫助程序將last_name =名稱,當它賦值給該變量」,所以當用戶分配一個值的形式,名稱(這是空值)進入last_name變量? –

+0

是的。只要@user不爲null。你可以使用attr_accessor自動爲你創建它。 http://www.rubyist.net/~slagell/ruby/accessors.html –

0

您可以更好地瞭解點#2語法:

def last_name=(name) 
end 

=是部分函數的名字。

等價的C會

void last_name_equals(char *name) {} 

剩下的就是一個Rails教程的工作。

+0

我還是不明白。所以你告訴我的是,「變量名爲空,並將其空值賦給last_name? –

+0

@TestTest:否,'name'只是變量的名稱。如果調用instance.last_name ='「foo」','name'將在你的方法中包含''foo「'。 – InternetSeriousBusiness