2010-06-16 62 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"