Пошта блогы неге айнымалыымды көре алмайды?

Мен Ruby-ге жаңа және осы жағдайдағы қарапайым «Синатра» қосымшасында «пошта» тасын пайдаланып,

post "/email/send" do

  @recipient = params[:email]

  Mail.deliver do 
    to @recipient # throws error as this is undefined
    from '[email protected]'
    subject 'testing sendmail'
    body 'testing sendmail'
  end

  erb :email_sent

end

Алайда бұл жақсы жұмыс істейді:

post "/email/send" do

  Mail.deliver do 
    to '[email protected]'
    from '[email protected]'
    subject 'testing sendmail'
    body 'testing sendmail'
  end

  erb :email_sent

end

Мен бұл блоктық ауқыммен және менің түсінбеушілігіммен байланысты нәрсе деп ойлаймын.

8
params [: email] дегенмен емес, сіздің проблемаңыз бар-жоғына сенімдісіз бе? Сіз оны шығарып көрдіңіз бе? Мұнда жергілікті айнымалысы жеткілікті болуы керек, себебі блок - бәрібір жабылады.
қосылды автор Michael Kohl, көзі

3 жауаптар

Джайликтің айтуы бойынша, Mail # delivery блокты іске қосу кезінде self өзгеретін #instance_exec басқаша түрде #to және #from әдістерін шақыруға болады).

Мұнда сіз шынымен жасай аласыз, бұл блоктың жабылуы деген фактіні қолдану. Бұл дегеніміз, айналасындағы барлық жергілікті айнымалы мәндерді «есінде».

recipient = params[:email]
Mail.deliver do 
    to recipient # 'recipient' is a local variable, not a method, not an instance variable
...
end

Қайтадан:

  • instance variables and method calls depend on self
  • #instance_exec changes the self;
  • local variables don't depend on self and are remembered by blocks because blocks are closures.
14
қосылды
Мәселен менің қате айнымалы айнымалыны қолданды? Мен мысалдың айнымалысын қолдандым, себебі деректерді ЭББ үлгісінде қолжетімді болғым келеді және егер қателеспесем - бұл данасы болуы керек дегенді білдіреді. Мен бұл туралы жергілікті айнымалы мәнді жариялау арқылы немесе бір тәсілдің көмегімен пайдалана аламын. Рубиге рахмет, әлі күнге дейін ұнайды :)
қосылды автор Ciaran Archer, көзі
Және біраз қосымша: бұл әрекет ruby нұсқасына байланысты емес. Сондықтан мен «Ruby 1.9» деген сөзді сұрақ тақырыбынан алып тастаймын, бұл шатастырар болуы мүмкін.
қосылды автор Daniel Vartanov, көзі

Mail үшін құжаттарды оқып шығыңыз әрі жұмыс істейтін жақсы балама шешім таба аласыз. Қолданудың орнына:

Mail.deliver do 
  to @recipient # throws error as this is undefined
  from '[email protected]'
  subject 'testing sendmail'
  body 'testing sendmail'
end

Параметрлерде өтіп, блокты ескермей, Mail new() әдісін қолдануға болады:

Mail.new(
  to:      @recipient,
  from:    '[email protected]',
  subject: 'testing sendmail',
  body:    'testing sendmail'
).deliver!

немесе аралас хэш элементінің анықтамалары:

Mail.new(
  :to      => @recipient,
  :from    => '[email protected]',
  :subject => 'testing sendmail',
  :body    => 'testing sendmail'
).deliver!

Көру барысында, сіз көресіз:

pry(main)> Mail.new(
pry(main)* to: '[email protected]',
pry(main)* from: '[email protected]' << `hostname`.strip,
pry(main)* subject: 'test mail gem',
pry(main)* body: 'this is only a test'
pry(main)* ).deliver!
=> #, , , <[email protected]>>, , , , >

new әдісінің бірнеше нұсқасы бар пайдалана аласыз. Бұл құжаттардан және жақсы жұмыс істей алады:

Бүйірлік ескертпе ретінде, жаңа электрондық поштаны Mail :: Message нысанын тікелей жасау арқылы, содан кейін жолдар, символ немесе тікелей әдіс қоңыраулары арқылы мәндер арқылы беру арқылы жасауға болады. Қосымша ақпарат алу үшін Пошта хабарын қараңыз.

 mail = Mail.new
 mail.to = '[email protected]'
 mail[:from] = '[email protected]'
 mail['subject'] = 'This is an email'
 mail.body = 'This is the body'

содан кейін mail.deliver! .

Сондай-ақ, алдыңғы мысалда хабардың хатқалтасындағы түрлі тақырыптарға қол жеткізудің бірнеше жолы бар екенін ескеріңіз. Бұл жақсы ойластырылған және ruby жолымен жақсы көрінетін икемді тас.

8
қосылды
Мен үшін бұл зерттеуді өткізгеніңіз үшін рақмет :) Мен RubyGems-ді қарап шығудың орнына GitHub құжаттарына тым жақын қараған едім. Онда сабақ алынды. Тағы да рахмет.
қосылды автор Ciaran Archer, көзі

Менің ойымша, пошта жәшігі сорғыш астындағы instance_exec қолданады. instance_exec қоңырау шалушыдан емес, шақырылатын нысаннан үлгі айнымалыларын қолданады. Мен қалаған нәрсе - пошта шлюзінде үйреншікті әдістерді пайдаланбайтын, бірақ нақты конфигурация нысанын блокқа жіберетін және сол жерден шығатын әдіс табу. Бірнеше сұр шашты толтырады.

3
қосылды