Предварительный просмотр почтовых программ на уровнях без разработки
У меня есть несколько предварительных просмотров по почте spec/mailer/previews
, На development
Я могу просмотреть все превью под /rails/mailers/
, Однако по умолчанию эта функциональность не существует в других средах.
Я хотел включить его на staging
Окружающая среда и взял очередь из этого поста здесь.
Я сделал следующие изменения -
конфиг / routes.rb
# Add the routes manually
if Rails.env.staging?
get "/rails/mailers" => "rails/mailers#index"
get "/rails/mailers/*path" => "rails/mailers#preview"
end
конфигурации / среда / staging.rb
Rails.application.configure do
# Define the mailer preview path
config.action_mailer.preview_path = "spec/mailers/previews"
# Specifically add that path and all files under it to the autoload paths
config.autoload_paths = Dir["#{config.root}/#{config.action_mailer.preview_path}/**"]
end
class ::Rails::MailersController
include Rails.application.routes.url_helpers
# Override the method just for this controller so `MailersController` thinks
# all requests are local.
def local_request?
true
end
end
Однако при постановке я получаю следующую ошибку при попытке загрузить /rails/mailers
страница -
LoadError (No such file to load -- spec/mailers/previews/admin_mailer_preview):
Странная вещь... этот файл определенно существует. И когда я проверяю пути автозагрузки при постановке, этот файл определенно находится в массиве / списке.
Любые мысли о том, что может происходить здесь, или как мне еще разоблачить эту конечную точку?
Спасибо!
3 ответа
Имеющий consider_all_requests_local = true
или исправление local_request?
может быть проблема безопасности. Вот решение, которое мы используем, оно использует аутентификацию, чтобы только администраторы могли получить доступ к превью:
# in any enviroment
config.action_mailer.show_previews = true
# in initializers/mailer_previews.rb
# (use your own authentication methods)
# Allow admins to see previews if show_previews enabled.
# It does not affect dev env, as this setting is nil there.
if Rails.application.config.action_mailer.show_previews
Rails::MailersController.prepend_before_action do
authenticate_user!
head :forbidden unless current_user.admin?
end
end
# If you use rspec-rails, it makes rails use spec/mailers/previews
# as previews path. Most likely you don't have rspec-rails on
# staging/production, so need to add this to application.rb:
#
# Make previews available in environments without rspec-rails.
config.action_mailer.preview_path = Rails.root.join('spec', 'mailers', 'previews')
# Bonus: specs. Update with your `sign_in` implementation
# and have `config.action_mailer.show_previews = true` in test.rb
RSpec.describe Rails::MailersController do
shared_examples 'visible to admin only' do
it { should redirect_to new_user_session_path }
context 'for signed in user' do
sign_in { create(:user) }
it { should be_forbidden }
context 'admin' do
let(:current_user) { create(:user, admin: true) }
it { should be_ok }
end
end
end
describe '#index' do
subject { get '/rails/mailers' }
include_examples 'visible to admin only'
end
describe '#preview' do
subject { get '/rails/mailers/devise/mailer') }
include_examples 'visible to admin only'
end
end
Это зависит от того, какую версию Rails вы используете, но если вы используете 4.2+, добавьте эти строки в staging.rb
должно помочь:
config.action_mailer.show_previews = true
config.consider_all_requests_local = true
Другим вариантом будет использование службы, такой как https://mailtrap.io/ а также получение более интересной информации об электронной почте, такой как анализ спама и ответов, - я считаю, что это лучший вариант для моей промежуточной среды.