अपने ActionMailer विचारों में मेरे दृश्य सहायकों का उपयोग कैसे करें?


227

मैं app/helpers/annotations_helper.rbअपने ReportMailer विचारों ( app/views/report_mailer/usage_report.text.html.erb) में जिन विधियों को परिभाषित करता हूं, उनका उपयोग करना चाहता हूं । मैं यह कैसे करु?

इस गाइड के आधार पर ऐसा लगता है कि add_template_helper(helper_module)विधि वह कर सकती है जो मैं चाहता हूं, लेकिन मैं इसका उपयोग नहीं कर सकता।

(BTW, एक कारण है कि आप मेलर विचारों में सहायकों के एक अलग सेट तक पहुंच प्राप्त करते हैं। यह बहुत कष्टप्रद है।)


जवाबों:


324

मेलर वर्ग में जो आप अपने ईमेल का प्रबंधन करने के लिए उपयोग कर रहे हैं:

class ReportMailer < ActionMailer::Base
  add_template_helper(AnnotationsHelper)

  ...
end

4
इस मामले में मेरे लिए काम नहीं करता (रेल 3.2.8): मेरे पास ApplicationController में परिभाषित एक विधि है और इसे हेल्पर_मिथोड द्वारा एक सहायक बनाते हैं: my_helper_wannabe, लेकिन विधि "my_helper_wannabe" मेलर में उपलब्ध नहीं है।
ग्यांग गुयेन

नीचे दिए गए ड्यूक का जवाब देखें कि रेल को कैसे संभाला जाए 3.
क्रिस पीटर्स

जेल में काम करता है 3.2.11
जन

1
मैंने सोचा था कि ये स्वचालित रूप से रेल 4 में शामिल होने वाले थे? guide.rubyonrails.org/…
gabeodess

6
यह एक प्राचीन उत्तर है, लेकिन सिर्फ यह कहने के लिए कि यह रेल 5.2
आर्चोनिक

158

रेल 3 में, अपने ActionMailer वर्ग में सबसे ऊपर सहायक विधि का उपयोग करें:

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

मैं सिर्फ एक ब्लॉक में पारित हुआ, क्योंकि मुझे केवल एक मेलर में इसकी आवश्यकता है:

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

(config.action_mailer.default_url_options सेट करना सुनिश्चित करें।)

(और यदि आप url_for का उपयोग करते हैं, तो इसमें पास होना सुनिश्चित करें: only_path => false)


3
यह काम करता है, लेकिन पहले से ही ApplicationController में परिभाषित सहायकों को अलग-अलग ActionMailer वर्गों के लिए भी फिर से निर्दिष्ट करने के लिए akward लगता है। ActionMailer ActionController का विस्तार करता है इसलिए वे एक सामान्य पदानुक्रम से आते हैं। अपने समाधान की तुलना में रेल पर एक टिप्पणी ...
Robbie613

3
और यदि सहायक एक नेमस्पेस में है तो आप कर सकते हैंhelper :'namespace/mail'
जोनाथन बेटसन

यदि सहायक एक नेमस्पेस में है, तो यह सिर्फ एक स्ट्रिंग (प्रतीक के बजाय) को स्वीकार करता हैhelper 'namespace/mail'
Pwnrar

2
रेल पर काम करता है 5.2!
रूसो

28

रेल 3 के सभी मेलर्स के लिए ("एप्लिकेशन" हेल्पर की स्थापना):

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

साझा किए गए ईमेल भाग के लिए सबसे अच्छा जवाब। धन्यवाद!
एलेक्सी शीन

2
सच नहीं - helper :applicationरेल्स 4.2.1 में ठीक काम करता है।
स्टेकचैस्टर

के लिए भी अपने ईमेल टेम्पलेट्स के लिए ठीक काम करता है devisehelper :applicationइस मामले में काम नहीं करता है।
स्वेन आर।

1
4.2.5.1 के लिए काम नहीं कर रहा है - include ApplicationHelperकाम किया
दास्य

23

रूबी ऑन रेल 4 के लिए, मुझे 2 काम करने थे:

(1) जैसा कि ड्यूक ने पहले ही कहा था, यदि आप जिस सहायक को जोड़ना चाहते हैं वह UsersHelperउदाहरण के लिए है, तो जोड़ें

helper :users

व्युत्पन्न ActionMailerवर्ग (जैसे app/mailers/user_mailer.rb)

(२) उसके बाद, मुझे एक नई त्रुटि मिली:

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

इसे ठीक करने के लिए, लाइन जोड़ें

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

config/environments/*.rbफ़ाइलों में से प्रत्येक के लिए । के लिए config/environments/production.rb, localhostउत्पादन सहायक-उत्पन्न उरलों के लिए एक अधिक उपयुक्त होस्ट के साथ बदलें ।


प्रश्न: # 2 के लिए, मेल दृश्य को इस जानकारी की आवश्यकता क्यों है, और नियमित दृश्य नहीं है?

एक: क्योंकि नियमित विचारों को जानने की जरूरत नहीं है host, क्योंकि सभी उत्पन्न लिंक होस्ट से लिंक किए गए हैं। लिंक है कि ईमेल में दिखाई ही मेजबान से सेवा नहीं कर रहे हैं (जब तक आप से लिंक कर रहे hotmail.comया gmail.com, आदि)


रचित नामों के बारे में क्या? User::ComposedHelper
सिरिल डचोन-डोरिस

20

आप बस अपने मेलर में जोड़ सकते हैं

helper :application

या आपको जो भी सहायक चाहिए


4
यह पहले की प्रतिक्रिया का डुप्लिकेट है - @ शेवुन
रोबेबी 613

1
रेल पर काम करता है 5.2!
रूसो

17

(यह एक पुराना सवाल है, लेकिन रेल विकसित हो गई है इसलिए मैं साझा करता हूं कि मेरे लिए रेल 5.2 में क्या काम करता है।)

आमतौर पर आप किसी ईमेल के विषय पंक्ति के साथ-साथ HTML का भी प्रतिपादन करने के लिए कस्टम व्यू हेल्पर का उपयोग करना चाह सकते हैं। इस मामले में जहां एप्लिकेशन / हेल्पर्स / एप्लिकेशन_हेलपर.rb में व्यू हेल्पर इस प्रकार है:

module ApplicationHelper

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

end

मैं एक डायनामिक ईमेल सब्जेक्ट लाइन और टेम्प्लेट बना सकता हूं, जो दोनों हेल्पर का उपयोग करते हैं, लेकिन मुझे रेल्स को एप्लिकेशन / मेलर / user_mailer.rb में दो अलग-अलग तरीकों से स्पष्ट रूप से ApplicationHelper का उपयोग करने की आवश्यकता है, जैसा कि आप दूसरी और तीसरी पंक्ति में देख सकते हैं। :

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

मुझे यह उल्लेख करना चाहिए कि ये दो लाइनें काम करती हैं और साथ ही एक या दूसरे का चयन करती हैं:

helper :application

add_template_helper(ApplicationHelper)

FWIW, ऐप / विचार / user_mailer / party_thanks.html.erb पर ईमेल टेम्पलेट इस तरह दिखता है:

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

और ऐप / कंट्रोलर / पार्टी_कंट्रोलर.आरबी कंट्रोलर ऐसा दिखता है

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

मुझे ओपी (@Tom Lehman) और @gabeodess से सहमत होना है कि यह सब काफी जटिल लगता है कि दिए गए https://guides.rubyonrails.org/action_mailer_basics.html#using-action-mailer-helpers इसलिए शायद मुझे कुछ याद आ रहा है .. ।


5

मेरे मामले में Rails4 के लिए, मुझे यह पसंद है:

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

तथा

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

ताकि आपको add_template_helperहर जगह निर्दिष्ट न करना पड़े ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.