mailer_preview_request_model 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/README.md +116 -0
- data/Rakefile +9 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/mailer_preview_request_model.rb +66 -0
- data/lib/mailer_preview_request_model/version.rb +3 -0
- data/mailer_preview_request_model.gemspec +34 -0
- metadata +126 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3fdd30fb4d510f4b86fc148179f9a95cfa43b9bb
|
4
|
+
data.tar.gz: 0650358a6b09c043bcef81682140e45b4eabeb5d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 391fb7a7f617b12d8538d9d5870ebf65c46c984c2632ad501d637741289be775d2c816a7e81c06e11acd3c3de2e7c36df1bb53776b0b0957129a9b3293049316
|
7
|
+
data.tar.gz: 7ca0012084a3c127e8b49cdb69b715bd35d177bbaeebedb9c37e6c4dbb38f340657bbff3196c121c7a2c1b5f977020506c3ccbf2d621d93d7ba2bacc11798255
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
# MailerPreviewRequestModel
|
2
|
+
|
3
|
+
This gem will patch Rails untill I convince Rails team to merge [PR 20646](https://github.com/rails/rails/pull/20646),
|
4
|
+
that will enable Mailer Preview to pass params from Controller.
|
5
|
+
|
6
|
+
references:
|
7
|
+
|
8
|
+
* https://github.com/rails/rails/pull/20646
|
9
|
+
* https://github.com/rails/rails/pull/20608
|
10
|
+
* http://stackoverflow.com/questions/29129542/access-request-parameters-in-rails-4-1-mailer-preview
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
Add this line to your application's Gemfile:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
gem 'mailer_preview_request_model'
|
18
|
+
```
|
19
|
+
|
20
|
+
And then execute:
|
21
|
+
|
22
|
+
$ bundle
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
By default you will have access to method `mailer_model` which is equal
|
27
|
+
to controller `params`
|
28
|
+
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
class MyMailerPreview < ActionMailer::Preview
|
32
|
+
def good_news
|
33
|
+
MyMailer.good_news(client)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def client
|
38
|
+
@client ||= Client.find(request_model.fetch(:client_id))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
`http://0.0.0.0:3000/rails/mailers/my_mailer?client_id=123`
|
44
|
+
|
45
|
+
But you can extend it to do more complex stuff (like authentication
|
46
|
+
objects) ... and teoretically you can have this on some Staging server
|
47
|
+
to preview email templates and stuff.
|
48
|
+
|
49
|
+
```
|
50
|
+
# config/initializer/mailer_preview.rb
|
51
|
+
|
52
|
+
module OverrideRequestModel
|
53
|
+
def self.prepended(base)
|
54
|
+
base.before_action :authenticate!
|
55
|
+
end
|
56
|
+
|
57
|
+
def request_model
|
58
|
+
OpenStruct.new(user: current_user, client_id: params[:client_id])
|
59
|
+
end
|
60
|
+
|
61
|
+
def current_user
|
62
|
+
User.find session[:current_user_id]
|
63
|
+
end
|
64
|
+
|
65
|
+
def authenticate!
|
66
|
+
raise "not authenticated" unless current_user.admin?
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
Rails::MailersController.prepend OverrideRequestModel
|
71
|
+
```
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
# app/mailer_previews/my_mailer_preview.rb
|
75
|
+
class MyMailerPreview < ActionMailer::Preview
|
76
|
+
|
77
|
+
def good_news
|
78
|
+
do_some_stuff_with_user_object
|
79
|
+
MyMailer.good_news(client)
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
def do_some_stuff_with_user_object
|
84
|
+
request_model.user.do_some_stuff
|
85
|
+
end
|
86
|
+
|
87
|
+
def client
|
88
|
+
Client.find(request_model.client_id)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
```
|
92
|
+
|
93
|
+
`http://0.0.0.0:3000/rails/mailers/my_mailer/good_news?user_id:123&client_id:345`
|
94
|
+
|
95
|
+
## Contributing
|
96
|
+
|
97
|
+
1. Fork it ( https://github.com/[my-github-username]/mailer_preview_request_model/fork )
|
98
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
99
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
100
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
101
|
+
5. Create a new Pull Request
|
102
|
+
|
103
|
+
### Abount the code
|
104
|
+
|
105
|
+
The original code of Mailer Preview is composed of long methods with too
|
106
|
+
much responsibilities. In order to make this patch work I needed to copy
|
107
|
+
relativly large chunks of original code and extend the original with it
|
108
|
+
alteration.
|
109
|
+
|
110
|
+
### Trobleshooting dev enviroment
|
111
|
+
|
112
|
+
* if Nokogiri fails to install make sure you have `zlib1g-dev` installed
|
113
|
+
|
114
|
+
## Todo:
|
115
|
+
|
116
|
+
* ApplicationTests::MailerPreviewsTest
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "mailer_preview_request_model"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require "mailer_preview_request_model/version"
|
2
|
+
|
3
|
+
module MailerPreviewRequestModel
|
4
|
+
module PreviewWithRequestModel
|
5
|
+
def self.prepended(base)
|
6
|
+
base.send :attr_accessor, :request_model
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module MailersControllerWithRequestModel
|
11
|
+
def preview
|
12
|
+
if params[:path] == @preview.preview_name
|
13
|
+
@page_title = "Mailer Previews for #{@preview.preview_name}"
|
14
|
+
render action: 'mailer'
|
15
|
+
else
|
16
|
+
email = File.basename(params[:path])
|
17
|
+
|
18
|
+
if @preview.email_exists?(email)
|
19
|
+
@email = @preview.call(email, request_model)
|
20
|
+
|
21
|
+
if params[:part]
|
22
|
+
part_type = Mime::Type.lookup(params[:part])
|
23
|
+
|
24
|
+
if part = find_part(part_type)
|
25
|
+
response.content_type = part_type
|
26
|
+
render text: part.respond_to?(:decoded) ? part.decoded : part
|
27
|
+
else
|
28
|
+
raise AbstractController::ActionNotFound, "Email part '#{part_type}' not found in #{@preview.name}##{email}"
|
29
|
+
end
|
30
|
+
else
|
31
|
+
@part = find_preferred_part(request.format, Mime::HTML, Mime::TEXT)
|
32
|
+
render action: 'email', layout: false, formats: %w[html]
|
33
|
+
end
|
34
|
+
else
|
35
|
+
raise AbstractController::ActionNotFound, "Email '#{email}' not found in #{@preview.name}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
def request_model
|
43
|
+
params
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
ActionMailer::Preview.prepend MailerPreviewRequestModel::PreviewWithRequestModel
|
49
|
+
Rails::MailersController.prepend MailerPreviewRequestModel::MailersControllerWithRequestModel
|
50
|
+
|
51
|
+
# due to original code in Rails beeing not extendable I cannot do
|
52
|
+
# ActionMailer::Preview.extend MailerPreviewRequestModel::PreviewWithRequestModel::ClassMethods
|
53
|
+
# therefore I need to monkey patch the class method
|
54
|
+
module ActionMailer
|
55
|
+
class Preview
|
56
|
+
class << self
|
57
|
+
def call(email, request_model)
|
58
|
+
preview = self.new
|
59
|
+
preview.request_model = request_model
|
60
|
+
message = preview.public_send(email)
|
61
|
+
inform_preview_interceptors(message)
|
62
|
+
message
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'mailer_preview_request_model/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "mailer_preview_request_model"
|
8
|
+
spec.version = MailerPreviewRequestModel::VERSION
|
9
|
+
spec.authors = ["Tomas Valent"]
|
10
|
+
spec.email = ["equivalent@eq8.eu"]
|
11
|
+
|
12
|
+
spec.summary = %q{Enable Rails ActionMailer Preview to accept argumeents}
|
13
|
+
spec.description = %q{gem to patch Rails untill PR 20646 https://github.com/rails/rails/pull/20646 is merged that will enable Mailer Preview to pass params}
|
14
|
+
spec.homepage = "https://github.com/equivalent/mailer_preview_request_model"
|
15
|
+
|
16
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
17
|
+
# delete this section to allow pushing this gem to any host.
|
18
|
+
if spec.respond_to?(:metadata)
|
19
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
20
|
+
else
|
21
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
22
|
+
end
|
23
|
+
|
24
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
25
|
+
spec.bindir = "exe"
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
|
+
spec.require_paths = ["lib"]
|
28
|
+
|
29
|
+
spec.add_dependency "railties", "~> 4.1"
|
30
|
+
spec.add_dependency "actionmailer", "~> 4.1"
|
31
|
+
spec.add_development_dependency "bundler", "~> 1.9"
|
32
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
33
|
+
spec.add_development_dependency "minitest", "~> 5.8"
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mailer_preview_request_model
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tomas Valent
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: railties
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: actionmailer
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.9'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.9'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '10.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '10.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5.8'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5.8'
|
83
|
+
description: gem to patch Rails untill PR 20646 https://github.com/rails/rails/pull/20646
|
84
|
+
is merged that will enable Mailer Preview to pass params
|
85
|
+
email:
|
86
|
+
- equivalent@eq8.eu
|
87
|
+
executables: []
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- ".gitignore"
|
92
|
+
- ".rspec"
|
93
|
+
- ".travis.yml"
|
94
|
+
- Gemfile
|
95
|
+
- README.md
|
96
|
+
- Rakefile
|
97
|
+
- bin/console
|
98
|
+
- bin/setup
|
99
|
+
- lib/mailer_preview_request_model.rb
|
100
|
+
- lib/mailer_preview_request_model/version.rb
|
101
|
+
- mailer_preview_request_model.gemspec
|
102
|
+
homepage: https://github.com/equivalent/mailer_preview_request_model
|
103
|
+
licenses: []
|
104
|
+
metadata:
|
105
|
+
allowed_push_host: https://rubygems.org
|
106
|
+
post_install_message:
|
107
|
+
rdoc_options: []
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
requirements: []
|
121
|
+
rubyforge_project:
|
122
|
+
rubygems_version: 2.4.6
|
123
|
+
signing_key:
|
124
|
+
specification_version: 4
|
125
|
+
summary: Enable Rails ActionMailer Preview to accept argumeents
|
126
|
+
test_files: []
|