Action Mailer Basics rails guide中的语法是什么?
class UserMailer < ActionMailer::Base
def welcome_email(user)
recipients user.email
from "My Awesome Site Notifications <notifications@example.com>"
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"
是变量的赋值,称为“from”?
答案 0 :(得分:15)
不,这是方法调用。方法的名称是from
,参数是一个字符串。在Ruby中,方法调用的括号是可选的,所以
from "Some text for this field"
与
相同from("Some text for this field")
Rails(以及许多Ruby库)喜欢以自然语言风格表达代码,因此无括号的版本读取更好,因此在示例中使用它的原因。
答案 1 :(得分:2)
调用带有参数from
"Some text for this field"
该方法来自UserMailer扩展的ActionMailer::Base
类。
在Ruby中,方法调用的括号是可选的,除非某些内容不明确,因此该语句等同于from(“此字段的某些文本”)
Rails的编码风格尽可能接近自然语言,因此除非必要,否则不使用括号。
调用此方法会将实例变量@from
设置为您提供的值,以便以后在发送消息时使用。
通常,如果您拥有获取和设置变量的访问方法,则可以from=
设置值,from
返回值,但ActionMailer
使用名为{{1}的内容定义adv_attr_accessor
方法,这样如果你用一个参数调用它,那么它就像一个setter,但是如果你调用它没有参数,那么它就像一个getter。
这可以在actionmailer-2.x.x / lib / action_mailer / base.rb和actionmailer-2.x.x / lib / action_mailer / adv_attr_accessor.rb
中看到答案 2 :(得分:1)
这不是作业。在Ruby中,使用赋值运算符=
完成赋值,如下所示:
var = val
您可能正在考虑一些Lisp方言,其中赋值如下:
(def var val)
这只是一个简单的无接收消息发送。
在Ruby中,消息发送的一般语法是
receiver.selector(argument1, argument2)
但是,如果receiver
为self
,则可以不使用receiver
,所以
selector(argument1, argument2)
与
相同self.selector(argument1, argument2)
[注意:这不是真的。在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"
此外,在Ruby 1.9中,可以使用替代的Hash
字面语法编写Symbol
字面,其中所有键都是Hash
:
{ key1: val1, key2: val2 }
与旧语法
相同{ :key1 => val1, :key2 => val2 }
这意味着,至少在Ruby 1.9中,最后一行也可以写成
body user: user, url: "http://example.com/login"
答案 3 :(得分:0)
您还可以调用from
属性。它是电子邮件的属性,但它的实现方式是隐藏的(封装)。这是一件好事。这意味着如果Rails核心决定将@from
更改为多个变量,则不需要更改任何代码。