2015-08-18 83 views
0

我試圖將一些額外的信息傳遞給設計郵件程序方法。比如我想通過對用戶使用的攝影師信息...從Devise郵件程序檢索選項

MyDeviseMailer.confirmation_instructions(@user, nil, photographer: true ) 
我有困難獲取這些信息

。我已經嘗試過使用opts

def confirmation_instructions(record, token, opts={}) 
@token = token 
@user = record 
@is_photographer = opts[:photographer] 
devise_mail(record, :confirmation_instructions, opts) 
end 

回答

0

你在正確的道路上。

我添加了一個簡化和一個改進:

  • 使用super委派工作的其餘回到設計的最初實現
  • 使用opts#delete,以避免在OPTS值獲得的電子郵件標題自動設置(設計默認)。

app/mailers/my_devise_mailer.rb

class MyDeviseMailer < Devise::Mailer 
    helper :application # gives access to all helpers defined within `application_helper`. 
    include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url` 
    default template_path: 'devise/mailer' # to make sure that your mailer uses the devise views 

    def confirmation_instructions(record, token, opts={}) 
     @is_photographer = opts.delete(:photographer) 
     super 
    end 
end 

現在,該視圖可以使用@is_photographer

app/views/devise/mailer/confirmation_instructions.html.erb

<% if @is_photographer %> 
    <p>Welcome photographer <%= @email %>!</p> 
<% else %> 
    <p>Welcome <%= @email %>!</p> 
<% end %> 

也許,一個更簡單的方法是,以避免創建MyDeviseMailer一起,只是把is_photographer?作爲一個屬性閱讀器或方法上User直接使用它在色器件郵件模板關閉@resource的。

app/models/user.rb

class User 
    ... 
    def is_photographer? 
     ... 
    end 
    # or 
    attr_reader :is_photographer? 
    # or 
    attr_accessor :is_photographer? 
end 

app/views/devise/mailer/confirmation_instructions.html.erb

<% if @resource.is_photographer? %> 
    <p>Welcome photographer <%= @email %>!</p> 
<% else %> 
    <p>Welcome <%= @email %>!</p> 
<% end %> 

此外,此選項給你的權力,以輕鬆User添加額外的屬性或方法,包括他們在郵件模板信息提供他們真正屬於User模型。對於不屬於的屬性,定製您自己的MyDeviseMailer的第一個選項將有所幫助。如果存在用戶歸屬屬性和非用戶歸屬屬性的混合,則也可以將兩個選項結合起來。

我希望這能回答你的問題。讓我知道你是否需要進一步的幫助或對此有進一步的問題。

Andy Maleh