Странный рубиновый синтаксис - PullRequest
4 голосов
/ 16 июня 2010

Синтаксис Основы Action Mailer Руководство по рельсам?

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"?

Ответы [ 4 ]

15 голосов
/ 16 июня 2010

Нет, это вызов метода.Имя метода - from, а аргумент - строка.В Ruby круглые скобки вокруг вызовов методов являются необязательными, поэтому

from "Some text for this field"

- это то же самое, что

from("Some text for this field")

Rails (и многие библиотеки Ruby) любят выражать код в стиле естественного языка,тем не менее, версия без скобок читается лучше, поэтому и используется в примерах.

2 голосов
/ 16 июня 2010

Это вызов метода from с аргументом "Some text for this field"

Метод происходит из класса ActionMailer::Base, из которого расширяется ваш UserMailer.

В скобках Rubyвызов метода необязателен, если только что-то не будет неоднозначным, поэтому оператор эквивалентен from («Некоторый текст для этого поля»)

В Rails есть стиль кодирования, который предпочитает быть близким к естественному языку, где это возможно, поэтомуне используйте скобки без необходимости.

Вызов этого метода устанавливает переменную экземпляра @from в значение, которое вы предоставляете, чтобы его можно было использовать позже при отправке сообщения.

Обычно, когда у вас есть средство доступаметоды для получения и установки переменной: from= для установки значения и from для возврата значения, однако ActionMailer использует нечто, называемое adv_attr_accessor, для определения метода from, чтобы при вызове его спараметр тогда он действует как установщик, но если вы вызываете его без параметров, он действует как получатель.

Это можно увидетьactionmailer-2.xx / lib / action_mailer / base.rb и actionmailer-2.xx / lib / action_mailer / adv_attr_accessor.rb

1 голос
/ 16 июня 2010

Это не задание.В 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 s, может быть записан с использованием альтернативного Hash буквальный синтаксис:

 { key1: val1, key2: val2 }

совпадает со старым синтаксисом

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

, что означает, что, по крайней мере в Ruby 1.9, эта последняя строка также может быть записана как

  body          user: user, url: "http://example.com/login"
0 голосов
/ 16 июня 2010

Вы также можете назвать from атрибутом.Это свойство электронной почты, но как оно реализовано, скрыто от вас (инкапсуляция).Это хорошая вещь.Это означает, что если бы ядро ​​Rails решило, что лучше поменять @from на несколько переменных, вам не нужно будет менять код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...