2015-08-21 102 views
2

我正在使用Devise創建/登錄軌道4應用程序中的用戶,我遇到了幾個覆蓋視圖的問題。設計不使用自定義郵件視圖

我已經生成了設計視圖和控制器,他們正在正常工作,使用我的新視圖。要創建這些觀點我用:

rails generate devise:views admins 

當它試圖發送郵件的問題來了,它仍然使用設計默認視圖:

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

的意見其餘的都是正確的從我的加載/管理員/會話和類似的。

我也在devise.rb中設置了config.scoped_views = true

嘗試使用自定義郵件程序也和模板路徑設置爲我的觀點,但沒有工作,沒有(它仍然試圖用色器件意見發送郵件):

default template_path: 'blablabla/admins/mailer' 

任何想法什麼都可以錯誤?

回答

0

在你的config /初始化/ devise.rb嘗試這樣定義你的模板文件:

Rails.application.config.to_prepare do 
     Devise::SessionsController.layout "admin/registration" 
     Devise::RegistrationsController.layout proc { |controller|    user_signed_in? ? 
    "admin/application" : "admin/registration" } 
     Devise::ConfirmationsController.layout "admin/registration" 
     Devise::UnlocksController.layout "admin/registration" 
     Devise::PasswordsController.layout "admin/registration" 
     Devise::Mailer.layout "mailer/user_email" 
    end 

最後一行是配置郵件佈局模板。

+0

感謝@迭戈 - senott,我想即使有新的佈局仍然會尋找/色器件/意見:( – zapico

+0

你有這個config.mailer = 'devise :: mailer'在你的devise.rb文件中啓用了嗎? –

+0

是的,我已經試過了,沒有它:( – zapico

0

這隻猴子補丁爲我工作。

Devise::Mapping.class_eval do 
    def self.find_scope!(obj) 
    obj = obj.devise_scope if obj.respond_to?(:devise_scope) 
    case obj 
    when String, Symbol 
     return obj.to_sym 
    when Class 
     Devise.mappings.each_value { |m| return m.name if obj <= m.to } 
    else 
     # patch 
     Devise.mappings.each_value { |m| return m.name if obj.instance_of?(m.to) } 
     # Devise.mappings.each_value { |m| return m.name if obj.is_a?(m.to) } 
    end 

    raise "Could not find a valid mapping for #{obj.inspect}" 
    end 
end 

Rails的4.2.5.1,設計3.5.6

+0

猴子修補可能工作,但可能不是正確的解決方案。猴子補丁你認證庫。 – Cimm

3

所以這是不完美的,但它的工作對我來說...

傳球選擇採用PARAM從定製控制器

電子郵件版本
UserNotificationsMailer.confirmation_instructions(user, user.confirmation_token, { subject: "Please confirm your account.", version: "request" }).deliver_later 

然後在方法中設置的一個實例變量

def confirmation_instructions(record, token, opts={}) 
    @version = opts[:version] 
    super 
end 

,並使用該變量confirmation_instructions.html.erb

<% if @version.nil? %> 
    <p>Welcome <%= @email %>!</p> 

    <p>You can confirm your account email through the link below:</p> 

    <p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p> 
<% elsif @version == "request" %> 
    <p><b>From: location.org</b></p> 

    <p> <b>Subject:</b> <%= @subject %> </p> 

    <p>We noticed you signed up for an account...but have not confirmed yet.</p> 
    <p>Confirm you account now and get started!</p> 
    <p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p> 

    <p> Respond to <%= mail_to(@email) %> </p> 
<% elsif @version == "warn" %> 
    <p><b>From: location.org</b></p> 

    <p> <b>Subject:</b> <%= @subject %> </p> 

    <p>We noticed you signed up for an account ... confirmed soon it may be scheduled for removal.</p> 
    <p>Confirm you account now and get started!</p> 
    <p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p> 

    <p> Respond to <%= mail_to(@email) %> </p> 
<% end %> 

沒有猴子補丁,這是很好的,併發送不同的版本。仍然在尋找一個完美的解決方案,但它目前有效。

0

我正面臨與最新設計版本相同的問題。在你的路由嘗試調用

devise_for :admins 

devise_for :users