Görünüm yardımcılarımı ActionMailer görünümlerimde nasıl kullanabilirim?


227

app/helpers/annotations_helper.rbReportMailer görünümlerimde ( app/views/report_mailer/usage_report.text.html.erb) tanımladığım yöntemleri kullanmak istiyorum . Bunu nasıl yaparım?

Bu kılavuza dayanarak , add_template_helper(helper_module)yöntem istediğimi yapabilir gibi görünüyor , ancak nasıl kullanılacağını anlayamıyorum.

(BTW, posta gönderilerindeki farklı yardımcılara erişmenizin bir nedeni var mı? Bu oldukça can sıkıcı bir durum.)


Yanıtlar:


324

E-postalarınızı yönetmek için kullandığınız e-posta sınıfında:

class ReportMailer < ActionMailer::Base
  add_template_helper(AnnotationsHelper)

  ...
end

4
Bu durumda benim için çalışmıyor (Rails 3.2.8): ApplicationController'da tanımlanan bir yöntemim var ve helper_method tarafından bir yardımcı yapıyorum: my_helper_wannabe, ancak "my_helper_wannabe" yöntemi postacıda kullanılamaz.
Giang Nguyen

Rails 3'te nasıl başa çıkılacağı için Duke'un cevabına bakınız.
Chris Peters

Raylarda Çalışır 3.2.11
Jan

1
Bunların Rails 4'e otomatik olarak dahil edilmesi gerektiğini düşündüm. guides.rubyonrails.org/…
gabeodess

6
Bu eski bir cevap ama bunun Rails 5.2'de çalıştığını söylemek için çalıyor
Archonic

158

Rails 3'te, ActionMailer sınıfınızın üst kısmındaki yardımcı yöntemi kullanmanız yeterlidir:

helper :mail   # loads app/helpers/mail_helper.rb & includes MailHelper

Sadece bir Mailler'de ihtiyacım olduğu için bir blokta geçtim:

helper do
  def host_url_for(url_path)
    root_url.chop + url_path
  end
end

(config.action_mailer.default_url_options ayarını yaptığınızdan emin olun.)

(ve url_for kullanıyorsanız, ilettiğinizden emin olun: only_path => false)


3
Bu çalışır, ancak ApplicationController'da tanımlanmış yardımcıları ayrı ayrı ActionMailer sınıflarına da yeniden belirtmek akward hisseder. ActionMailer, ortak bir hiyerarşiden gelmeleri için ActionController'ı genişletir. Rails sizin çözüm daha bir yorum daha ...
robbie613

3
Ve eğer yardımcı bir isim alanındaysa yapabilirsinizhelper :'namespace/mail'
Jonathon Batson

yardımcı bir ad alanındaysa, sadece bir dize (bir sembol yerine) kabul ederhelper 'namespace/mail'
Pwnrar

2
Raylar 5.2 üzerinde çalışıyor!
RousseauAlexandre

28

Rails 3'teki tüm postalar için ("uygulama" yardımcısını ayarlama):

# config/application.rb:
...
config.to_prepare do
  ActionMailer::Base.helper "application"
end

Paylaşılan e-posta bölümleri için en iyi yanıt. Teşekkürler!
Alexey Shein

2
DOĞRU DEĞİL - helper :applicationRails 4.2.1'de iyi çalışıyor.
steakchaser

İçin kendi e-posta şablonları için bile iyi çalışır devise. helper :applicationbu durumda çalışmaz.
Sven R.

1
4.2.5.1 için çalışmıyor - include ApplicationHelperişe
yaradı

23

Ruby on Rails 4 için 2 şey yapmak zorunda kaldım:

(1) Duke'un dediği gibi, eklemek istediğiniz yardımcıUsersHelper örneğin,

helper :users

türetilmiş ActionMailer sınıfa (ör. app/mailers/user_mailer.rb)

(2) Bundan sonra yeni bir hata aldım:

ActionView::Template::Error (Missing host to link to! Please provide the :host
parameter, set default_url_options[:host], or set :only_path to true)

Bunu düzeltmek için satırı ekleyin

config.action_mailer.default_url_options = { :host => 'localhost' }

her config/environments/*.rbdosyaya. İçinconfig/environments/production.rb , localhostyardımcı üretim tarafından üretilen URL'ler için daha uygun bir ana makine ile değiştirin .


S: # 2 için, posta görünümünün neden bu bilgilere ihtiyacı var ve normal görünümler buna gerek duymuyor?

C: Düzenli görünümlerin bilmesi gerekmediğinden host, oluşturulan tüm bağlantılar, bağlantı verdikleri ana bilgisayardan sunulduğundan. E-postalarda gösterilen bağlantılar aynı ana bilgisayardan sunulmaz ( hotmail.comveya vb.'ye bağlanmadıkça gmail.com)


Oluşturulan isimler ne olacak? User::ComposedHelper
Cyril Duchon-Doris

20

Sadece postanıza ekleyebilirsiniz

helper :application

veya hangi yardıma ihtiyacınız olursa olsun


4
Bu önceki yanıtın bir kopyası - @Shevaun
robbie613

1
Raylar 5.2 üzerinde çalışıyor!
RousseauAlexandre

17

(Bu eski bir soru ama Rails gelişti, bu yüzden Rails 5.2'de benim için neyin işe yaradığını paylaşıyorum.)

Genellikle, bir e-postanın konu satırını ve HTML'yi oluştururken özel bir görünüm yardımcısı kullanmak isteyebilirsiniz. Görünüm yardımcısının app / helpers / application_helper.rb dosyasında aşağıdaki gibi olması durumunda:

module ApplicationHelper

  def mydate(time, timezone)
    time.in_time_zone(timezone).strftime("%A %-d %B %Y")
  end

end

Hem yardımcıyı kullanan dinamik bir e-posta konu satırı ve şablonu oluşturabilirim, ancak Rails'e ApplicationHelper'ı apps / mailer / user_mailer.rb'de açıkça iki farklı şekilde kullanmasını söylemeliyim , burada ikinci ve üçüncü satırlarda görebileceğiniz gibi :

class UserMailer < ApplicationMailer

  include ApplicationHelper  # This enables me to use mydate in the subject line
  helper :application  # This enables me to use mydate in the email template (party_thanks.html.erb)

  def party_thanks
    @party = params[:party]
    mail(to: 'user@domain.com',
    subject: "Thanks for coming on #{mydate(@party.created_at, @party.timezone)}")
  end

end

Bu iki satırın da aynı şekilde çalıştığını belirtmeliyim, bu yüzden birini veya diğerini seçin:

helper :application

add_template_helper(ApplicationHelper)

FWIW, app / views / user_mailer / party_thanks.html.erb adresindeki e-posta şablonu şuna benzer:

<p>
  Thanks for coming on <%= mydate(@party.created_at, @party.timezone) %>
</p>

Ve app / controller / party_controller.rb denetleyicisi şöyle görünür

class PartyController < ApplicationController
  ...
  def create
    ...
    UserMailer.with(party: @party).party_thanks.deliver_later
    ...
  end
end

Ben OP (@Tom Lehman) ve @gabeodess ile https://guides.rubyonrails.org/action_mailer_basics.html#using-action-action-mailer-helpers göz önüne alındığında tüm bunların oldukça kıvrımlı olduğunu kabul etmem gerekiyor . .


5

Rails4 için benim durumumda, bunu gibi:

# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  add_template_helper ApplicationHelper
  ...
end

ve

# app/mailers/user_mailer.rb
class AccountMailer < ApplicationMailer
  def some_method(x, y)
  end
end

böylece add_template_helperher yerde belirtmeniz gerekmez .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.