таинственная ошибка синтаксиса рубина - PullRequest
13 голосов
/ 27 декабря 2010

Я в замешательстве: это почти копирование / вставка из руководства по рассылке действий RoR, и все же выдает синтаксическую ошибку:

class Contact < ActionMailer::Base


  def contact a_name, a_company, a_phone, a_email, a_comments
    subject    "Contact request from #{name}"
    recipients "some@address.com"
    from       "some_other@address.com"
    sent_on    Time.now
    body       { :name => a_name, :company => a_company, :phone => a_phone, :email => a_email, :comments => a_comments }
  end

end

ошибка:

app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting '}' body { :name => a_name, :company => a_company... ^ app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ...{ :name => a_name, :company => a_company, :phone => a_phone,... ^ app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ...ompany => a_company, :phone => a_phone, :email => a_email, :... ^ app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ..., :phone => a_phone, :email => a_email, :comments => a_comme... ^ app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ...email => a_email, :comments => a_comments, } ^

есть идеи?я не могу понять, что я делаю здесь неправильно.

Ответы [ 2 ]

28 голосов
/ 27 декабря 2010

Добавьте круглые скобки body({...}), чтобы явно указать, что вы выполняете вызов метода с аргументом hash.

В противном случае {...}, вероятно, путают с передачей функции (или лямбда-выражения, каков бы ни был официальный термин) в методе body: body { puts "Hello world!" }

11 голосов
/ 27 декабря 2010

Удаление { и } из вызова (1) до #body.


(1) Обновление: Эта ошибка возникает из-за того, что { } имеет два различных значения в Ruby: выражения хэш-значений и блоки методов.Если процедура вызывается в режиме поэзии (без паренов), тогда возникает двусмысленность, если парсер встречает { после имени метода.Это начало блока или это параметр, который является выражением Hash?Предположение, неудачное в вашем конкретном случае, состоит в том, что это блок.

Теперь, как это происходит, Ruby не требует { } вокруг хеш-выражений, когда хеш является последним аргументом метода.Таким образом, результат состоит в том, что есть как минимум два способа решения этой проблемы: (1) удалить { и } - Ruby понимает, что вы передаете параметр Hash;или (2) добавить метод parens.Видя, как Rails обычно используется в поэтическом режиме, кажется, имеет смысл удалять символы и использовать преимущества умного синтаксического анализатора Ruby, а не добавлять их обратно на C или Java.

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