Reputation: 993
I have a problem that occurs only in a production environment, deployed at heroku.
The Heroku logs says:
[...]
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"...",
"users"=>{"name"=>"name", "email"=>"[email protected]",
"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"},
"commit"=>"Join Us!"}
Processing by UsersController#create as HTML
Rendered notifier/new_user_creation.html.erb (0.7ms)
heroku[router]: POST stark-blabla-345.herokuapp.com/users dyno=web.1 queue=0 wait=0ms
service=333ms status=500 bytes=643
Completed 500 Internal Server Error in 284ms
app[web.1]: Errno::ENOENT (No such file or directory - /assets/):***
app[web.1]: app/controllers/users_controller.rb:13:in `create
This error happened after adding a Mailer component with these characteristics:
class Notifier < ActionMailer::Base
default from: "..."
def new_user_creation(user)
@user = user
@url= "http://stark-blabla-345.herokuapp.com/users/
#{user.create_digitally_signed_remember_token}/confirm"
mail to:user.email, subject: 'bla bla, complete the registration process'
end
end
with the following templete new_user_creation.html.erb :
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><%=t("confirm_account_creation")%></title>
<style type="text/css">
body{ background:#f1f1ee; }
.title{font-size: 300%; font-family: Georgia, serif; font-weight:bold;}
.indented{margin-left:5%; padding:1%;}
</style>
</head>
<body>
<table width="100%" id="background" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<img src="http://stark-blabla-345.herokuapp.com/assets/
red_flower-a4105a7cc626711e8789b1c2b21777b6.png"
align="middle">
<span class="title"><%=t("base_title")%></span>
</td>
</tr>
<tr>
<td>
<p class="indented"><%=t("confirm_account_creation")%><p>
<p class="indented"><a href="<%=@url%>">COMPLETE ACCOUNT CREATION PROCESS</a></p>
</td>
</tr>
</table>
</body>
</html>
UsersController#create():
def create
@user = User.new(params[:users])
if @user.save
Notifier.new_user_creation(@user).deliver
flash.now[:block] = t("users.create.created")
render "confirm_registration"
else
render 'new'
end
end
My Gemfile :
source 'https://rubygems.org'
ruby '1.9.3'
gem 'rails', '3.2.6'
gem "heroku"
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
gem 'bootstrap-sass'
gem 'jquery-rails'
gem "paperclip", "2.7.0" # :git => "git://github.com/thoughtbot/paperclip.git"
gem 'bcrypt-ruby', '3.0.1'
gem 'nokogiri'
gem 'premailer-rails3'
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'uglifier', '>= 1.0.3'
end
group :test,:development do
gem 'sqlite3'
gem 'rspec-rails','2.9.0'
gem 'execjs'
gem 'annotate', '~> 2.4.1.beta'
end
group :test do
gem 'spork'
gem 'cucumber-rails', require:false;
gem 'capybara'
gem 'database_cleaner'
gem 'factory_girl'
gem "launchy"
end
group :production do
gem 'pg'
gem 'thin'
end
The interesting part of production.rb:
MyApp::Application.configure do
config.action_mailer.default_url_options =
{ host: "stark-blabla-345.herokuapp.com" }
config.action_mailer.raise_delivery_errors = false # the same with true
config.action_mailer.delivery_method = :smtp
config.action_mailer.default :charset => "utf-8"
config.action_mailer.smtp_settings = {
address: "smtp.gmail.com",
port: 587,
domain: "stark-blabla-345.herokuapp.com",
authentication: "plain",
enable_starttls_auto: true,
user_name: ENV["GMAIL_USERNAME"],
password: ENV["GMAIL_PASSWORD"]
}
end
Upvotes: 3
Views: 2586
Reputation: 1612
Been struggling with this for a number of hours and thought I would add my solution for your benefit.
Using premailer-rails3 (1.3.1)
I wanted my email CSS to match the bootstrap styling, so I thought a lazy way would be to simply use <%= stylesheet_link_tag "application", :media => "all" %>
however this causes the cannot find /assets/ issue.
So I ended up doing the following:
*= require_tree
from my application.css
, which is good practice anyway, and required by main css file*= require_self *= require <MyMainSiteCSS> */
app/stylesheets/email.css
with the following@import "bootstrap"; @import "bootstrap-responsive";
<head> <link href="email.css" media="all" rel="stylesheet" type="text/css"> </head>
So, now everything is working and I have great bootstrap styling in my emails.
Upvotes: 3
Reputation: 2155
This is not a heroku-only issue. This exception is thrown when email.css
does not exist or (as of premailer-rails 1.3.x) a inline style
tag does not exist.
The solution is to add email.css
to your assets folder or add an empty <style type="text/css"> </style>
to your email HTML.
Upvotes: 3
Reputation: 4807
Are you using the premailer-rails3
gem? I found that version 1.2.0 caused this exact same problem. Downgrading to 1.1.0 fixed it. Hope that helps!
Upvotes: 0