Where do I put helper methods for ActionMailer views?

前端 未结 6 1247
无人共我
无人共我 2020-12-09 16:41

I have a method that takes an array of strings and joins them so they do something like this:

>> my_arr
=> [\"A\", \"B\", \"C\"]
>> and_join(m         


        
相关标签:
6条回答
  • 2020-12-09 16:47

    An already answered question, but I didn't get where/what-file to modify from the other SO responses. Here is how I did it:

    At the bottom of app/config/initializers/devise.rb you can add this:

    Devise::Mailer.class_eval do
      helper :application # includes "ApplicationHelper"
    end
    

    This example will include the methods in /app/helpers/application_helper.rb. You could include another helper-file instead - if, for example, the method is only for the mailer or used for one other controller only. The def I needed is used all over, so I put in in that file so all views could access it.

    0 讨论(0)
  • 2020-12-09 16:48

    It would be worth looking at the to_sentence extension method for arrays that rails provides.

    0 讨论(0)
  • 2020-12-09 16:54

    Use the helper method in your mailer to define the helper class to use

    # mailer_helper.rb
    module MailerHelper
      def and_join(arr)
        # whatever …
      end
    end
    
    # my_mailer.rb
    class MyMailer < ActionMailer::Base
      helper MailerHelper
      …
    end
    

    then you can use the methods in views as well.

    0 讨论(0)
  • 2020-12-09 16:58

    +1, worked fine, just a little correction:

    You have to use module instead of class in the helper file:

    # mailer_helper.rb
    module MailerHelper
      def and_join(arr)
        # whatever …
      end
    end
    
    0 讨论(0)
  • 2020-12-09 17:02

    In my case, for Rails 5.1, I had to use both include and helper methods, like this:

    include ApplicationHelper
    helper :application
    

    And then just proceed to use the method normally.

    class MyMailer < ActionMailer::Base
      include ApplicationHelper
      helper :application
    
      def my_mailer_method
        my_helper_method_declared_in_application_helper
        ..
      end
    end
    
    0 讨论(0)
  • 2020-12-09 17:07

    If you have some one off methods you want to use in the view, you can use helper_method directly in your mailer.

    class MyMailer < ApplicationMailer
      def mailer
        mail to: '', subject: ''
      end
    
      private
    
      helper_method def something_to_use_in_the_view
      end
    end
    

    something_to_use_in_the_view will be available in your view.

    0 讨论(0)
提交回复
热议问题