inbox 0.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/README.md +126 -0
  2. data/app/assets/images/inbox/results_bg.png +0 -0
  3. data/app/assets/images/inbox/tree_bg.png +0 -0
  4. data/app/assets/javascripts/inbox/application.js +1 -2
  5. data/app/assets/javascripts/inbox/emails.js +2 -0
  6. data/app/assets/stylesheets/inbox/emails.css +59 -0
  7. data/app/assets/stylesheets/inbox/panel.css.erb +229 -0
  8. data/app/assets/stylesheets/inbox/reset.css +53 -0
  9. data/app/controllers/inbox/application_controller.rb +1 -1
  10. data/app/controllers/inbox/emails_controller.rb +52 -0
  11. data/app/helpers/inbox/emails_helper.rb +4 -0
  12. data/app/mailers/inbox/email_mailer.rb +11 -0
  13. data/app/models/inbox/email.rb +51 -0
  14. data/app/views/inbox/emails/index.html.erb +0 -0
  15. data/app/views/inbox/emails/new.html.erb +9 -0
  16. data/app/views/inbox/emails/show.html.erb +48 -0
  17. data/app/views/layouts/inbox/application.html.erb +10 -9
  18. data/app/views/layouts/inbox/inbox.html.erb +25 -0
  19. data/config/routes.rb +4 -0
  20. data/lib/inbox/engine.rb +4 -0
  21. data/lib/inbox/version.rb +1 -1
  22. data/lib/inbox.rb +30 -0
  23. data/test/dummy/config/environments/development.rb +3 -1
  24. data/test/dummy/config/initializers/backtrace_silencers.rb +1 -1
  25. data/test/dummy/db/development.sqlite3 +0 -0
  26. data/test/dummy/db/production.sqlite3 +0 -0
  27. data/test/dummy/db/test.sqlite3 +0 -0
  28. data/test/dummy/log/development.log +3641 -0
  29. data/test/dummy/log/test.log +0 -0
  30. data/test/dummy/tmp/cache/assets/C4D/8B0/sprockets%2F5e1b589842222e2ea0043890c2c84539 +0 -0
  31. data/test/dummy/tmp/cache/assets/C6F/5C0/sprockets%2F259fb59d511a70d46436201b6770a04a +0 -0
  32. data/test/dummy/tmp/cache/assets/CF2/F90/sprockets%2F5378bb2470df984ccf2643991a6e476d +0 -0
  33. data/test/dummy/tmp/cache/assets/D0B/330/sprockets%2F582a2b19d6be92a0393afa63894d721a +0 -0
  34. data/test/dummy/tmp/cache/assets/D1B/CE0/sprockets%2F09c9c18794df089e62443d3debb117e5 +0 -0
  35. data/test/dummy/tmp/cache/assets/D1D/BA0/sprockets%2F29888f599d35bb11e4a8183d6dc5e23a +0 -0
  36. data/test/dummy/tmp/cache/assets/D1F/600/sprockets%2Fdd3578c9bd0719efe092c59655a25c55 +0 -0
  37. data/test/dummy/tmp/cache/assets/D21/920/sprockets%2F85fd59fe11746a33f5f917a923d84be3 +0 -0
  38. data/test/dummy/tmp/cache/assets/D4D/FB0/sprockets%2Fd5743837e8babdab4825364c4ee86f73 +0 -0
  39. data/test/dummy/tmp/cache/assets/D4F/520/sprockets%2F88ecb483df9e177ee775202ba0691ec7 +0 -0
  40. data/test/dummy/tmp/cache/assets/D6E/300/sprockets%2Fcc54b61039f74d6b8a2a7d04ad9d77f0 +0 -0
  41. data/test/dummy/tmp/cache/assets/D74/390/sprockets%2F5eda33e637dd54ff6a27bb76c482a473 +0 -0
  42. data/test/dummy/tmp/cache/assets/D76/170/sprockets%2Ffa5e461b362e11c80d5fd9e877fb63e2 +0 -0
  43. data/test/dummy/tmp/cache/assets/D7F/2D0/sprockets%2F141c2c9cb5235c8d21a00fbc8d7a2ab1 +0 -0
  44. data/test/dummy/tmp/cache/assets/D84/AA0/sprockets%2F5e841fe9d79e3ebf4333be8842b77bc5 +0 -0
  45. data/test/dummy/tmp/cache/assets/DA0/520/sprockets%2Fb8e93a54478c1f1a0e750ef2cbf74f3c +0 -0
  46. data/test/dummy/tmp/cache/assets/DC1/520/sprockets%2Feb8cea402f0bf04560adcd0cb8807b88 +0 -0
  47. data/test/dummy/tmp/mails/1345541756.4616725 +11 -0
  48. data/test/functional/inbox/email_test.rb +9 -0
  49. data/test/functional/inbox/emails_controller_test.rb +16 -0
  50. data/test/unit/helpers/inbox/emails_helper_test.rb +6 -0
  51. metadata +146 -56
  52. data/README.rdoc +0 -3
data/README.md ADDED
@@ -0,0 +1,126 @@
1
+ Inbox
2
+ =====
3
+
4
+
5
+ Description
6
+ -----------
7
+
8
+ * Preview send emails in development and test mode.
9
+
10
+ * Test them using your standard Capybara matchers or
11
+ any other testing framework that you prefer.
12
+
13
+
14
+ Installation
15
+ ------------
16
+
17
+ In your `Gemfile` add:
18
+
19
+ ```ruby
20
+ gem 'inbox'
21
+ ```
22
+
23
+ And run:
24
+
25
+ ```
26
+ bundle install
27
+ ```
28
+
29
+
30
+ Setup
31
+ -----
32
+
33
+ Mount engine in `config/routes.rb`
34
+
35
+ ```ruby
36
+ Rails.application.routes.draw do
37
+ mount Inbox::Engine => "/inbox"
38
+ end
39
+ ```
40
+
41
+ Feel free to mount it under different route
42
+ if this one is already taken in your application
43
+
44
+ ```ruby
45
+ mount Inbox::Engine => "/mailer"
46
+ ```
47
+
48
+
49
+ Usage
50
+ -----
51
+
52
+ ### Manual
53
+
54
+ Navigate to `/inbox/<email>/emails` ex.: `/inbox/robert.pankowecki@gmail.com/emails`
55
+ to see a list of emails that would have been delivered to the user.
56
+
57
+ Click subject of the email to see its content
58
+
59
+ ### Testing framework
60
+
61
+ In [capybara](https://github.com/jnicklas/capybara/) or [bbq](https://github.com/drugpl/bbq)
62
+
63
+ ```ruby
64
+ visit("/inbox/robert.pankowecki@gmail.com/emails")
65
+ click_link("Subject of the email")
66
+ has_content?("This should be in email")
67
+ click_link("Some link in the email ex. account activation link")
68
+ ```
69
+
70
+ The nice thing is that this is just HTML page displaying email content so you can use
71
+ your favorite testing framework (`BBQ`, `Capybara`, `Test::Unit`, `Spinach`, `Cucumber`, `RSpec`, whatever)
72
+ for checking the content of page. And you can reuse your matchers.
73
+
74
+
75
+ ### Sending
76
+
77
+ Navigate to `/inbox/<email>/emails/new` ex.: `/inbox/robert.pankowecki@gmail.com/emails/new`
78
+ to see an ugly form for sending emails that you can use to play around and see if everything
79
+ works fine.
80
+
81
+ ### Clear send emails
82
+
83
+ ```ruby
84
+ ActionMailer::Base.deliveries.clear # in :test mode
85
+ Inbox::FileDelivery.new(ActionMailer::Base.inbox_settings).clear # in :inbox mode
86
+ ```
87
+
88
+ Async (distributed / queue)
89
+ ---------------------------
90
+
91
+ In case you want to have acceptance tests of emails that are
92
+ sent using external process (`resque`, `sidekiq`, ...) just set
93
+
94
+ ```ruby
95
+ config.action_mailer.delivery_method = :inbox
96
+ ```
97
+
98
+ in `config/environments/test.rb` and create `tmp/mails` directory.
99
+
100
+
101
+ If you send emails from your Rails models, controllers, services or use-cases you can stick with:
102
+
103
+ ```ruby
104
+ config.action_mailer.delivery_method = :test
105
+ ```
106
+
107
+
108
+ Look & Feel
109
+ -----------
110
+
111
+ ![Inbox gem look and feel](http://img832.imageshack.us/img832/1333/screenshotinboxgooglech.png)
112
+
113
+
114
+ Inspirations
115
+ ------------
116
+
117
+ * [https://github.com/37signals/mail_view](https://github.com/37signals/mail_view)
118
+ * [https://github.com/ryanb/letter_opener](https://github.com/ryanb/letter_opener)
119
+ * [https://github.com/suhrawardi/capybara_email/](https://github.com/suhrawardi/capybara_email/)
120
+ * [https://github.com/pawelpacana/mail_inbox/](https://github.com/pawelpacana/mail_inbox/)
121
+ * [http://api.rubyonrails.org/](http://api.rubyonrails.org/)
122
+
123
+ License
124
+ -------
125
+
126
+ MIT-LICENSE
Binary file
@@ -4,6 +4,5 @@
4
4
  // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
5
  // the compiled file.
6
6
  //
7
- //= require jquery
8
- //= require jquery_ujs
7
+
9
8
  //= require_tree .
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,59 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
5
+
6
+ #message_headers {
7
+ width: 75%;
8
+ padding: 20px 0 20px 0;
9
+ margin: 0;
10
+ background: #fff;
11
+ font-size: 12px;
12
+ font-family: "Lucida Grande";
13
+ border-bottom: 1px solid #dedede;
14
+ overflow: hidden;
15
+ float: left;
16
+ }
17
+
18
+ #message_headers dl {
19
+ margin: 0;
20
+ padding: 0;
21
+ }
22
+
23
+ #message_headers dt {
24
+ width: 60px;
25
+ padding: 1px;
26
+ float: left;
27
+ text-align: right;
28
+ font-weight: bold;
29
+ color: #7f7f7f;
30
+ }
31
+
32
+ #message_headers dd {
33
+ margin-left: 70px;
34
+ padding: 1px;
35
+ }
36
+
37
+ #message_headers p.alternate {
38
+ position: absolute;
39
+ top: 0;
40
+ right: 15px;
41
+ }
42
+
43
+ #message_headers p.alternate a {
44
+ color: #09c;
45
+ }
46
+
47
+ pre#message_body {
48
+ padding: 10px;
49
+ white-space: pre-wrap;
50
+ }
51
+
52
+ .clear {
53
+ clear: both;
54
+ display: block;
55
+ overflow: hidden;
56
+ visibility: hidden;
57
+ width: 0;
58
+ height: 0;
59
+ }
@@ -0,0 +1,229 @@
1
+ /* Panel (begin) */
2
+ .panel
3
+ {
4
+ float: left;
5
+ width: 25%;
6
+ height: 1000px;
7
+ top: 0;
8
+ left: 0;
9
+ background: #FFF;
10
+ font-family: "Helvetica Neue", "Arial", sans-serif;
11
+ }
12
+
13
+ /* Header with search box (begin) */
14
+ .panel .header
15
+ {
16
+ width: 100%;
17
+ height: 29px;
18
+ border-bottom: 1px solid #666;
19
+ position: relative;
20
+ left: 0; top: 0;
21
+ background: #e8e8e8;
22
+ }
23
+
24
+ .panel .header div
25
+ {
26
+ margin: 0 7px;
27
+ }
28
+ .panel .header table
29
+ {
30
+ height: 29px;
31
+ width: 100%;
32
+ }
33
+
34
+ .panel .header table td
35
+ {
36
+ vertical-align: middle;
37
+ text-align: middle;
38
+ }
39
+
40
+ .panel .header label
41
+ {
42
+ position: absolute;
43
+ font-size: 12px;
44
+ line-height: 29px;
45
+ margin-left: 3px;
46
+ color: #777;
47
+ cursor: text;
48
+ }
49
+
50
+ .panel .header table input
51
+ {
52
+ width: 100%;
53
+ box-sizing: border-box;
54
+ -moz-box-sizing: border-box;
55
+ -webkit-box-sizing: border-box;
56
+ display: inline-block;
57
+ -webkit-appearance: searchfield;
58
+ height: 22px;
59
+ //height: auto;
60
+ }
61
+
62
+ /* Header with search box (end) */
63
+
64
+
65
+ /* Results (begin) */
66
+ .panel .result
67
+ {
68
+
69
+ height: 1000px;
70
+ bottom: 0;
71
+ left: 0;
72
+ width: 100%;
73
+
74
+ overflow-y: scroll;
75
+ overflow-x: hidden;
76
+ -overflow-y: hidden;
77
+ background: #EEE url(<%= image_path("inbox/results_bg.png") %>);
78
+ z-index: 2;
79
+ //zoom:1;
80
+ }
81
+
82
+ .panel .result ul
83
+ {
84
+ font-size: 0.8em;
85
+ width: 100%;
86
+ background: #EEE url(<%= image_path("inbox/results_bg.png") %>);
87
+ //zoom:1;
88
+ }
89
+
90
+ .panel .result ul li
91
+ {
92
+ height: 46px;
93
+ overflow: hidden;
94
+ padding: 4px 10px 0 10px;
95
+ cursor: pointer;
96
+ }
97
+
98
+ .panel .result ul li h1
99
+ {
100
+ font-size: 13px;
101
+ font-weight: normal;
102
+ color: #333;
103
+ margin-bottom: 2px;
104
+ white-space: nowrap;
105
+ }
106
+
107
+ .panel .result ul li p
108
+ {
109
+ font-size: 11px;
110
+ color: #333;
111
+ margin-bottom: 2px;
112
+ white-space: nowrap;
113
+ }
114
+
115
+ .panel .result ul li h1 i,
116
+ .panel .result ul li p.snippet
117
+ {
118
+ color: #777;
119
+ }
120
+
121
+ .panel .result ul li b
122
+ {
123
+ color: #000;
124
+ }
125
+
126
+ .panel .result ul li.current
127
+ {
128
+ background: #C52F24;
129
+ }
130
+
131
+ .panel .result ul li.current h1,
132
+ .panel .result ul li.current p
133
+ {
134
+ color: #D9D9D9;
135
+ }
136
+
137
+ .panel .result ul li.current h1 i,
138
+ .panel .result ul li.current p.snippet
139
+ {
140
+ color: #ACACAC;
141
+ }
142
+
143
+ .panel .result ul li.current b
144
+ {
145
+ color: #FFF;
146
+ }
147
+
148
+
149
+ .panel .result ul li:hover,
150
+ .panel .result ul li.selected
151
+ {
152
+ background: #d0d0d0;
153
+ }
154
+
155
+ .panel .result ul li.current:hover
156
+ {
157
+ background: #C52F24;
158
+ }
159
+
160
+ .panel .result ul li .badge
161
+ {
162
+ margin-right: 0.4em;
163
+ margin-left: -0.2em;
164
+ padding: 0 0.2em;
165
+ color: #000;
166
+ border-radius: 3px;
167
+ }
168
+
169
+ .panel .result ul li .badge_1
170
+ {
171
+ background: #ACDBF4;
172
+ }
173
+
174
+ .panel .result ul li.current .badge_1
175
+ {
176
+ background: #97BFD7;
177
+ }
178
+
179
+ .panel .result ul li .badge_2
180
+ {
181
+ background: #ACF3C3;
182
+ }
183
+
184
+ .panel .result ul li.current .badge_2
185
+ {
186
+ background: #98D7AC;
187
+ }
188
+
189
+ .panel .result ul li .badge_3
190
+ {
191
+ background: #E0F3AC;
192
+ }
193
+
194
+ .panel .result ul li.current .badge_3
195
+ {
196
+ background: #C4D798;
197
+ }
198
+
199
+ .panel .result ul li .badge_4
200
+ {
201
+ background: #D7CA98;
202
+ }
203
+
204
+ .panel .result ul li.current .badge_4
205
+ {
206
+ background: #A6B0AC;
207
+ }
208
+
209
+ .panel .result ul li .badge_5
210
+ {
211
+ background: #F3C8AC;
212
+ }
213
+
214
+ .panel .result ul li.current .badge_5
215
+ {
216
+ background: #D7B198;
217
+ }
218
+
219
+ .panel .result ul li .badge_6
220
+ {
221
+ background: #F3ACC3;
222
+ }
223
+
224
+ .panel .result ul li.current .badge_6
225
+ {
226
+ background: #D798AB;
227
+ }
228
+
229
+ /* Panel (end) */
@@ -0,0 +1,53 @@
1
+ /* http://meyerweb.com/eric/tools/css/reset/ */
2
+ /* v1.0 | 20080212 */
3
+
4
+ html, body, div, span, applet, object, iframe,
5
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
6
+ a, abbr, acronym, address, big, cite, code,
7
+ del, dfn, em, font, img, ins, kbd, q, s, samp,
8
+ small, strike, strong, sub, sup, tt, var,
9
+ b, u, i, center,
10
+ dl, dt, dd, ol, ul, li,
11
+ fieldset, form, label, legend,
12
+ table, caption, tbody, tfoot, thead, tr, th, td {
13
+ margin: 0;
14
+ padding: 0;
15
+ border: 0;
16
+ outline: 0;
17
+ font-size: 100%;
18
+ vertical-align: baseline;
19
+ background: transparent;
20
+ }
21
+ body {
22
+ line-height: 1;
23
+ }
24
+ ol, ul {
25
+ list-style: none;
26
+ }
27
+ blockquote, q {
28
+ quotes: none;
29
+ }
30
+ blockquote:before, blockquote:after,
31
+ q:before, q:after {
32
+ content: '';
33
+ content: none;
34
+ }
35
+
36
+ /* remember to define focus styles! */
37
+ :focus {
38
+ outline: 0;
39
+ }
40
+
41
+ /* remember to highlight inserts somehow! */
42
+ ins {
43
+ text-decoration: none;
44
+ }
45
+ del {
46
+ text-decoration: line-through;
47
+ }
48
+
49
+ /* tables still need 'cellspacing="0"' in the markup */
50
+ table {
51
+ border-collapse: collapse;
52
+ border-spacing: 0;
53
+ }
@@ -1,4 +1,4 @@
1
1
  module Inbox
2
- class ApplicationController < ActionController::Base
2
+ class ApplicationController < ::ApplicationController
3
3
  end
4
4
  end
@@ -0,0 +1,52 @@
1
+ require 'mail'
2
+ require 'pathname'
3
+
4
+ module Inbox
5
+ class EmailsController < ApplicationController
6
+
7
+ layout 'inbox/inbox'
8
+ before_filter do
9
+ @mail = params[:mail]
10
+ mailer = case ActionMailer::Base.delivery_method
11
+ when :test
12
+ Mail::TestMailer
13
+ when :inbox
14
+ Inbox::FileDelivery.new ActionMailer::Base.inbox_settings
15
+ else
16
+ raise "ArgumentError"
17
+ end
18
+
19
+ @emails = mailer.deliveries.select{|e| Array.wrap(e.to).any?{|m| m.include?(@mail) } }.reverse
20
+ end
21
+
22
+ def index
23
+
24
+ end
25
+
26
+ def show
27
+ @email = @emails.find{|e| e.message_id == params[:id] }
28
+ @body_part = @email
29
+
30
+ if @email.multipart?
31
+ format = "." + (params[:format] || :html).to_s
32
+ content_type = Rack::Mime.mime_type(format)
33
+ @body_part = @email.parts.find { |part| part.content_type.match(content_type) } || @email.parts.first
34
+ end
35
+ end
36
+
37
+ def new
38
+ @email = Email.new()
39
+ end
40
+
41
+ def create
42
+ @email = Email.new(params[:email])
43
+ if @email.valid?
44
+ @email.deliver
45
+ redirect_to :action => :index
46
+ else
47
+ render :new
48
+ end
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,4 @@
1
+ module Inbox
2
+ module EmailsHelper
3
+ end
4
+ end
@@ -0,0 +1,11 @@
1
+ module Inbox
2
+ class EmailMailer < ActionMailer::Base
3
+ # default from: "from@example.com"
4
+
5
+ def normal(headers, body)
6
+ mail(headers) do |format|
7
+ format.html { render :text => body }
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,51 @@
1
+ module Inbox
2
+ class Email
3
+ extend ::ActiveModel::Naming
4
+ extend ::ActiveModel::Callbacks
5
+ extend ::ActiveModel::Translation
6
+
7
+ include ::ActiveModel::Conversion
8
+ include ::ActiveModel::Validations
9
+ include ::ActiveModel::Validations::Callbacks
10
+ include ::ActiveModel::MassAssignmentSecurity
11
+ # include ::ActiveModel::Warnings
12
+
13
+ PopularHeaders = [:from, :to, :cc, :bcc, :subject, :body, :reply_to]
14
+
15
+ attr_accessible *PopularHeaders
16
+
17
+ def initialize(attributes = {})
18
+ self.attributes = attributes
19
+ end
20
+
21
+ def attributes=(values)
22
+ values.stringify_keys!
23
+ @attributes = attributes.merge sanitize_for_mass_assignment(values)
24
+ end
25
+
26
+ def attributes
27
+ @attributes ||= ActiveSupport::HashWithIndifferentAccess.new
28
+ @attributes.clone
29
+ end
30
+
31
+ PopularHeaders.each do |header|
32
+ define_method(header) do
33
+ attributes[header]
34
+ end
35
+
36
+ define_method(:"#{header}=") do |value|
37
+ attributes[header]= value
38
+ end
39
+ end
40
+
41
+ def persisted?
42
+ false
43
+ end
44
+
45
+ def deliver
46
+ body = attributes.delete('body')
47
+ EmailMailer.normal(attributes, body).deliver
48
+ end
49
+
50
+ end
51
+ end
File without changes
@@ -0,0 +1,9 @@
1
+ <%= form_for(@email) do |f| %>
2
+ <%= f.text_field :from %>
3
+ <%= f.text_field :to %>
4
+ <%= f.text_field :cc %>
5
+ <%= f.text_field :bcc %>
6
+ <%= f.text_field :subject %>
7
+ <%= f.text_area :body %>
8
+ <%= f.submit %>
9
+ <% end %>
@@ -0,0 +1,48 @@
1
+ <head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=<%= @body_part.charset %>" />
3
+ </head>
4
+ <div id="message_headers">
5
+ <dl>
6
+ <dt>From:</dt>
7
+ <dd><%= Array.wrap(@email.from).join(", ") %> &nbsp;</dd>
8
+
9
+ <dt>Subject:</dt>
10
+ <dd><strong><%= @email.subject %></strong> &nbsp;</dd>
11
+
12
+ <dt>Date:</dt>
13
+ <dd><%= Time.now.strftime("%b %e, %Y %I:%M:%S %p %Z") %> &nbsp;</dd>
14
+
15
+ <dt>To:</dt>
16
+ <dd><%= Array.wrap(@email.to).join(", ") %> &nbsp;</dd>
17
+
18
+ <% if @email.cc.present? %>
19
+ <dt>Cc:</dt>
20
+ <dd><%= Array.wrap(@email.cc).join(", ") %> &nbsp;</dd>
21
+ <% end %>
22
+
23
+ <% if @email.bcc.present? %>
24
+ <dt>Bcc:</dt>
25
+ <dd><%= Array.wrap(@email.bcc).join(", ") %> &nbsp;</dd>
26
+ <% end %>
27
+ </dl>
28
+
29
+ <% if @email.multipart? %>
30
+ <p class="alternate">
31
+ <% if @body_part.content_type && @body_part.content_type.match(/text\/html/) %>
32
+ <a href="<%= :x %>.txt">View plain text version</a>
33
+ <% else %>
34
+ <a href="<%= :y %>.html">View HTML version</a>
35
+ <% end %>
36
+ </p>
37
+ <% end %>
38
+ </div>
39
+
40
+ <div id="message_body">
41
+ <% if @body_part.content_type && @body_part.content_type.match(/text\/html/) %>
42
+ <%= raw @body_part.body %>
43
+ <% else %>
44
+ <pre id="message_body">
45
+ <%= auto_link @body_part.body %>
46
+ </pre>
47
+ <% end %>
48
+ </div>
@@ -1,14 +1,15 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
- <head>
4
- <title>Inbox</title>
5
- <%= stylesheet_link_tag "inbox/application" %>
6
- <%= javascript_include_tag "inbox/application" %>
7
- <%= csrf_meta_tags %>
8
- </head>
9
- <body>
3
+ <head>
4
+ <title>Inbox</title>
5
+ <%= stylesheet_link_tag "inbox/application" %>
6
+ <%= javascript_include_tag "inbox/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
10
 
11
- <%= yield %>
11
+ <%= tmp = yield :application %>
12
+ <%= yield if tmp.blank? %>
12
13
 
13
- </body>
14
+ </body>
14
15
  </html>