render_component_4 4.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2b25925b5536281831d8c613483166489b67ec1d
4
+ data.tar.gz: 0cfbfd0052ab37972b3245cd897f043938fa057c
5
+ SHA512:
6
+ metadata.gz: f132ae42ab636a1c75b4e707aceea9f37a88a4a192ea9e1ddfeaf3076ba1a4a2b8f58bb66ae2ac6b160593b5d492f7877ae45d083b8d1cb2a0853fd2d999f2aa
7
+ data.tar.gz: d4b51c2d3dac0094ba6bf3f3d6b41c501a138d4b82afe52495f14c0c814b1c8403fdca972a9763243bd2ecbbb5e162719b07e9aeceae93376b7ebaa31879888c
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Sergio Cambra
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,37 @@
1
+ Components allow you to call other actions for their rendered response while executing another action. You can either delegate
2
+ the entire response rendering or you can mix a partial response in with your other content.
3
+
4
+ class WeblogController < ActionController::Base
5
+ # Performs a method and then lets hello_world output its render
6
+ def delegate_action
7
+ do_other_stuff_before_hello_world
8
+ render_component :controller => "greeter", :action => "hello_world", :params => { :person => "david" }
9
+ end
10
+ end
11
+
12
+ class GreeterController < ActionController::Base
13
+ def hello_world
14
+ render :text => "#{params[:person]} says, Hello World!"
15
+ end
16
+ end
17
+
18
+ The same can be done in a view to do a partial rendering:
19
+
20
+ Let's see a greeting:
21
+ <%= render_component :controller => "greeter", :action => "hello_world" %>
22
+
23
+ It is also possible to specify the controller as a class constant, bypassing the inflector
24
+ code to compute the controller class at runtime:
25
+
26
+ <%= render_component :controller => GreeterController, :action => "hello_world" %>
27
+
28
+ == When to use components
29
+
30
+ Components should be used with care. They're significantly slower than simply splitting reusable parts into partials and
31
+ conceptually more complicated. Don't use components as a way of separating concerns inside a single application. Instead,
32
+ reserve components to those rare cases where you truly have reusable view and controller elements that can be employed
33
+ across many applications at once.
34
+
35
+ So to repeat: Components are a special-purpose approach that can often be replaced with better use of partials and filters.
36
+
37
+ Copyright (c) 2007 David Heinemeier Hansson, released under the MIT license
@@ -0,0 +1,4 @@
1
+ require 'render_component/components'
2
+ require 'action_controller'
3
+ require 'action_dispatch/middleware/flash'
4
+ ActionController::Base.send :include, RenderComponent::Components
@@ -0,0 +1,159 @@
1
+ module RenderComponent
2
+ module Components
3
+ def self.included(base) #:nodoc:
4
+ base.class_eval do
5
+ include InstanceMethods
6
+ extend ClassMethods
7
+ helper HelperMethods
8
+
9
+ # If this controller was instantiated to process a component request,
10
+ # +parent_controller+ points to the instantiator of this controller.
11
+ attr_accessor :parent_controller
12
+
13
+ alias_method_chain :session, :render_component
14
+ # disabling since this is breaking flash..
15
+ #alias_method_chain :flash, :render_component
16
+ alias_method :component_request?, :parent_controller
17
+ end
18
+ end
19
+
20
+ module ClassMethods
21
+ # Track parent controller to identify component requests
22
+ def process_with_components(request, action, parent_controller = nil) #:nodoc:
23
+ controller = new
24
+ controller.parent_controller = parent_controller
25
+ controller.dispatch(action, request)
26
+ end
27
+ end
28
+
29
+ module HelperMethods
30
+ def render_component(options)
31
+ controller.send(:render_component_into_view, options)
32
+ end
33
+ end
34
+
35
+ module InstanceMethods
36
+
37
+ protected
38
+ # Renders the component specified as the response for the current method
39
+ def render_component(options) #:doc:
40
+ component_logging(options) do
41
+ response = component_response(options, true)[2]
42
+ if response.redirect_url
43
+ redirect_to response.redirect_url
44
+ else
45
+ render :text => response.body, :status => response.status
46
+ end
47
+ end
48
+ end
49
+
50
+ # Returns the component response as a string
51
+ def render_component_into_view(options) #:doc:
52
+ component_logging(options) do
53
+ response = component_response(options, false)[2]
54
+ if redirected = response.redirect_url
55
+ if redirected =~ %r{://}
56
+ location = URI.parse(redirected)
57
+ redirected = location.query ? "#{location.path}?#{location.query}" : location.path
58
+ end
59
+ render_component_into_view(Rails.application.routes.recognize_path(redirected, { :method => nil }))
60
+ else
61
+ response.body.html_safe
62
+ end
63
+ end
64
+ end
65
+
66
+
67
+ def flash_with_render_component(refresh = false) #:nodoc:
68
+ if @component_flash.nil? || refresh
69
+ @component_flash =
70
+ if defined?(@parent_controller)
71
+ debugger
72
+ @parent_controller.flash
73
+ elsif session['flash'].class == String
74
+ warn "WARNING: something, somehow, has replaced the flash by a inspect.to_s output. >>>#{session['flash']}<<<"
75
+ session['flash'] = ActionDispatch::Flash::FlashHash.new
76
+ else
77
+ session['flash'] ||= ActionDispatch::Flash::FlashHash.new
78
+ end
79
+ end
80
+ @component_flash
81
+ end
82
+
83
+ def session_with_render_component
84
+ #if defined?(@parent_controller)
85
+ if component_request?
86
+ @parent_controller.session
87
+ else
88
+ @_request.session
89
+ end
90
+ end
91
+
92
+ private
93
+ def component_response(options, reuse_response)
94
+ options[:controller] = options[:controller].to_s if options[:controller] && options[:controller].is_a?(Symbol)
95
+ klass = component_class(options)
96
+ component_request = request_for_component(klass.controller_path, options)
97
+ # needed ???
98
+ #if reuse_response
99
+ #component_request.env["action_controller.instance"].instance_variable_set :@_response, request.env["action_controller.instance"].instance_variable_get(:@_response)
100
+ #end
101
+ klass.process_with_components(component_request, options[:action], self)
102
+ end
103
+
104
+ # determine the controller class for the component request
105
+ def component_class(options)
106
+ if controller = options[:controller]
107
+ controller.is_a?(Class) ? controller : "#{controller.to_s.camelize}Controller".constantize
108
+ else
109
+ self.class
110
+ end
111
+ end
112
+
113
+ # Create a new request object based on the current request.
114
+ # NOT IMPLEMENTED FOR RAILS 3 SO FAR: The new request inherits the session from the current request,
115
+ # bypassing any session options set for the component controller's class
116
+ def request_for_component(controller_path, options)
117
+ if options.is_a? Hash
118
+ old_style_params = options.delete(:params)
119
+ options.merge!(old_style_params) unless old_style_params.nil?
120
+
121
+ request_params = options.symbolize_keys
122
+ request_env = {}
123
+
124
+ request.env.select {|key, value| key == key.upcase || key == 'rack.input'}.each {|item| request_env[item[0]] = item[1]}
125
+
126
+ request_env['REQUEST_URI'] = url_for(options)
127
+ request_env["PATH_INFO"] = url_for(options.merge(:only_path => true))
128
+ request_env["action_dispatch.request.symbolized_path_parameters"] = request_params
129
+ request_env["action_dispatch.request.parameters"] = request_params.with_indifferent_access
130
+ request_env["action_dispatch.request.path_parameters"] = Hash[request_params.select{|key, value| [:controller, :action].include?(key)}].with_indifferent_access
131
+ request_env["warden"] = request.env["warden"] if (request.env.has_key?("warden"))
132
+ component_request = ActionDispatch::Request.new(request_env)
133
+
134
+ # its an internal request request forgery protection has to be disabled
135
+ # because otherwise forgery detection might raise an error
136
+ component_request.instance_eval do
137
+ def forgery_whitelisted?
138
+ true
139
+ end
140
+ end
141
+ component_request
142
+ else
143
+ request
144
+ end
145
+ end
146
+
147
+ def component_logging(options)
148
+ if logger
149
+ logger.info "Start rendering component (#{options.inspect}): "
150
+ result = yield
151
+ logger.info "\n\nEnd of component rendering"
152
+ result
153
+ else
154
+ yield
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,9 @@
1
+ module RenderComponent
2
+ module Version
3
+ MAJOR = 4
4
+ MINOR = 1
5
+ PATCH = 4
6
+
7
+ STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: render_component_4
3
+ version: !ruby/object:Gem::Version
4
+ version: 4.1.4
5
+ platform: ruby
6
+ authors:
7
+ - David Heinemeier Hansson
8
+ - Sergio Cambra
9
+ - Mathieu Jobin
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2016-07-12 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: railties
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: 4.1.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: 4.1.0
29
+ description: Components allow you to call other actions for their rendered response
30
+ while executing another action
31
+ email:
32
+ - david@loudthinking.com
33
+ - sergio@programatica.es
34
+ - mathieu@justbudget.com
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files:
38
+ - LICENSE.txt
39
+ - README
40
+ files:
41
+ - LICENSE.txt
42
+ - README
43
+ - lib/render_component.rb
44
+ - lib/render_component/components.rb
45
+ - lib/render_component/version.rb
46
+ homepage: http://github.com/somekool/render_component
47
+ licenses:
48
+ - MIT
49
+ metadata: {}
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project:
66
+ rubygems_version: 2.5.1
67
+ signing_key:
68
+ specification_version: 4
69
+ summary: render actions in other controllers for their rendered response
70
+ test_files: []
71
+ has_rdoc: