2011-10-04 17 views
15

devise_invitableコントローラをオーバーライドしています。私の作成方法では、invitations_instructions電子メールテンプレートに余分な値を渡したいと思います。例えば、グループ名の場合は誰でもこれで成功しています。もしそうなら、私にここでいくつかの手がかりを与えてください。私が試したものをdevise_invitable電子メールテンプレートに余分なインスタンス変数を渡す

...

私の私の Users::InvitesController < Devise::InvitationsController作成方法で @groupは、電子メールテンプレートで定義されていません。

は...私の作成した後のように手動でメールを送ることで

self.resource = resource_class.invite!(params[resource_name], current_inviter, :skip_invitation => true) 
::Devise.mailer.invitation_instructions(self.resource).deliver 

:skip_invitation => trueを追加しようとしましたが、私はドキュメントから正しく読んでいないよ何かがあるので、これは間違った数の引数を与えます。

UPDATE - 可能性のある解決策

唯一の方法は、このように見えますが、提供されるテンプレートを使用して、より良い方法がある場合、私は好奇心旺盛だし、私の/app/controller/users/InvitesController#create にメーラー

を考案は(から継承しますUserMailerは私の一般的な(標準)アクションメーラーであるとのようなものを行くInvitationsController

self.resource = resource_class.invite!(params[resource_name], current_inviter) do |u| 
    u.skip_invitation = true 
end 
UserMailer.invitation_instructions(self.resource, current_inviter, @object).deliver 

...

def invitation_instructions(resource, inviter, object) 
    @resource = resource 
    @object = object 
    @inviter = inviter 

    mail(:to => resource.email, :subject => 'New invitation from ' + inviter.first_name) 
    end 
+2

このアップデートで提供されるソリューションは機能します。しかしそれは非常にきれいではないと感じます。私はまた、よりクリーンなソリューションを楽しむだろう。 1つの方法は、devise_invitableにパッチを当てて、 'invite!'を再定義してより多くのオプションを受け入れることです。 – Guillaume

+1

@ andrew-lankあなたは答えに更新を抽出し、それを受け入れてください。 –

答えて

2

あなたが探している解決策を達成するためのより洗練された方法があり、これはDevise's own procedures for overriding mailer templatesを使用することです。その後、config/initializers/devise.rbで、"MyMailer"config.mailerを設定

class MyMailer < 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 
end 

まずDevise::Mailerから拡張するカスタムメーラーを作成します。これは、あなたが送信し、好みに合わせてカスタマイズする電子メールを無効にすることを可能にするでしょう。

次に、あなたのために、あなたは、このようなinvitable_instructionsを無効にすることができます:あなたの例から

def invitation_instructions(record, token, opts={}) 
    # Determine a way to set object -- likely through a query of some type 
    @object = get_object_for(record) 

    opts[:subject] = 'New invitation from ' + inviter.first_name 

    super 
end 

主要争点は@group/@objectを設定するために余分なデータを渡しました。これを行うために、私は個人的に、メーラー内で何らかのタイプの照会(きれいではないが、カプセル化されているため、「魔法」が少ない)でこれらのオブジェクトを検索します。

また、deviseの代わりにカスタム電子メールテンプレートを使用したい場合は、app/views/my_mailer/ディレクトリに追加するだけで、そのディレクトリの電子メールを宝石からの電子メールより優先します。