2010-06-16 71 views
4

什麼語法在Action Mailer Basics導軌指南?奇怪的紅寶石語法

class UserMailer < ActionMailer::Base 
    def welcome_email(user) 
     recipients user.email 
     from   "My Awesome Site Notifications <[email protected]>" 
     subject  "Welcome to My Awesome Site" 
     sent_on  Time.now 
     body   {:user => user, :url => "http://example.com/login"} 
    end 
end 

我應該如何理解建築,就像

from "Some text for this field" 

它是一個分配的值給一個變量「從」叫什麼名字?

+1

請問您正在開發什麼樣的應用程序? Rails開發者在ActionMailer的上下文中遇到他的第一個無接收者消息發送是非常不尋常的。對於我所知道的大多數Rails開發人員來說,第一個無接收者消息發送是在「ActiveRecord」上下文中的「has_many」和「belongs_to」。 – 2010-06-16 12:46:07

回答

15

不,這是一個方法調用。該方法的名稱是from,參數是一個字符串。在Ruby中,方法調用周圍括號是可選的,所以

from "Some text for this field" 

相同

from("Some text for this field") 

鐵軌(和許多Ruby庫)喜歡在自然的語言風格來表達代碼,不過,這樣的無括號的版本更好,因此爲什麼在示例中使用它。

2

這是一個方法from的調用與參數"Some text for this field"

的方法來自於你的UserMailer從擴展ActionMailer::Base類。

在Ruby中圍繞一個方法調用的括號是可選的,除非東西會模糊的,因此語句相當於從(「一些文本此場」)

Rails有,喜接近編碼風格自然語言,因此除非必要,否則不使用括號。

調用此方法會將實例變量@from設置爲您提供的值,以便稍後在發送消息時使用它。

通常,當你有一個獲取和設置變量,你必須from=設定值,並from返回值的存取方法,但是ActionMailer使用一種叫做adv_attr_accessor,這樣,如果你有把它定義from方法參數,然後它作爲一個setter,但如果你沒有參數調用它,那麼它作爲一個getter。

這可以的ActionMailer-2.x.x可以看出/ lib目錄/ action_mailer/base.rb和的ActionMailer-2.x.x/lib目錄/ action_mailer/adv_attr_accessor.rb

0

你也叫from的屬性。這是電子郵件的一個屬性,但是它的實現方式對你來說是隱藏的(封裝)。這是一件好事。這意味着如果Rails核心決定將@from更改爲多個變量更好,則不需要更改任何代碼。

1

這不是一項任務。在Ruby中,分配使用賦值運算符=這樣做:

var = val 

你可能會想一些Lisp的方言,其中分配是這樣的:

(def var val) 

這只是一個簡單的receiverless消息發送。

在Ruby中,對於消息中發送一般語法是

receiver.selector(argument1, argument2) 

但是,如果receiverself,可以去掉的receiver,所以

selector(argument1, argument2) 

相同

self.selector(argument1, argument2) 

[注意:這不是真正的tru即在Ruby中,私有方法只能通過無接收方消息發送來調用,因此如果在此示例中self通過調用私有方法來響應selector消息,則只有第一個變體將起作用,第二個將引起NoMethodError例外。]

而且,在沒有歧義的情況下,可以去掉圍繞參數的括號像這樣:

receiver.selector argument1, argument2 

如果把兩者結合起來,你現在可以看到,

selector argument1, argument2 

相當於

self.selector(argument1, argument2) 

,從而

from "Some text for this field" 

等同於

self.from("Some text for this field") 

有一個在Ruby的消息發送語法第三個快捷鍵:如果最後一個參數的消息發送是一個Hash文字,那麼你可以省略花括號。所以,在上面的例子中的最後一行也可以寫成

body   :user => user, :url => "http://example.com/login" 

另外,在紅寶石1.9,一個Hash字面其中所有鍵是Symbol S可使用替代Hash文本語法被寫成:

{ key1: val1, key2: val2 } 

是一樣的舊的語法

{ :key1 => val1, :key2 => val2 } 

這意味着,至少在Ruby 1.9中,最後一行也可以寫成as

body   user: user, url: "http://example.com/login"