view_models 1.5.7 → 2.0.0.ruby19

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.
Files changed (97) hide show
  1. data/lib/init.rb +1 -0
  2. data/lib/padrino/README.textile +3 -0
  3. data/lib/padrino/init.rb +10 -0
  4. data/lib/padrino/lib/helpers/collection.rb +27 -0
  5. data/lib/padrino/lib/padrino/view_models.rb +19 -0
  6. data/lib/padrino/lib/view_models/base.rb +65 -0
  7. data/lib/rails2/README.textile +3 -0
  8. data/{TODO.textile → lib/rails2/TODO.textile} +0 -0
  9. data/{generators → lib/rails2/generators}/view_models/USAGE +0 -0
  10. data/{generators → lib/rails2/generators}/view_models/templates/README +0 -0
  11. data/{generators → lib/rails2/generators}/view_models/templates/spec/view_model_spec.rb +0 -0
  12. data/{generators → lib/rails2/generators}/view_models/templates/view_models/view_model.rb +0 -0
  13. data/{generators → lib/rails2/generators}/view_models/templates/views/_empty.html.haml +0 -0
  14. data/{generators → lib/rails2/generators}/view_models/templates/views/view_models/collection/_collection.html.erb +0 -0
  15. data/{generators → lib/rails2/generators}/view_models/templates/views/view_models/collection/_collection.html.haml +0 -0
  16. data/{generators → lib/rails2/generators}/view_models/templates/views/view_models/collection/_collection.text.erb +0 -0
  17. data/{generators → lib/rails2/generators}/view_models/templates/views/view_models/collection/_list.html.erb +0 -0
  18. data/{generators → lib/rails2/generators}/view_models/templates/views/view_models/collection/_list.text.erb +0 -0
  19. data/{generators → lib/rails2/generators}/view_models/templates/views/view_models/collection/_pagination.html.haml +0 -0
  20. data/{generators → lib/rails2/generators}/view_models/templates/views/view_models/collection/_pagination.text.erb +0 -0
  21. data/{generators → lib/rails2/generators}/view_models/templates/views/view_models/collection/_table.html.haml +0 -0
  22. data/{generators → lib/rails2/generators}/view_models/templates/views/view_models/collection/_table.text.erb +0 -0
  23. data/{generators → lib/rails2/generators}/view_models/view_models_generator.rb +0 -0
  24. data/lib/rails2/init.rb +18 -0
  25. data/lib/{experimental → rails2/lib/experimental}/modules_in_render_hierarchy.rb +0 -0
  26. data/lib/{extensions → rails2/lib/extensions}/view.rb +0 -0
  27. data/lib/rails2/lib/helpers/collection.rb +27 -0
  28. data/lib/{helpers → rails2/lib/helpers}/view.rb +0 -0
  29. data/lib/rails2/lib/view_models.rb +1 -0
  30. data/lib/rails2/lib/view_models/base.rb +99 -0
  31. data/lib/{view_models → rails2/lib/view_models}/view.rb +5 -1
  32. data/lib/shared/README.textile +3 -0
  33. data/lib/shared/init.rb +11 -0
  34. data/lib/shared/lib/view_models.rb +4 -0
  35. data/lib/{view_models → shared/lib/view_models}/base.rb +46 -91
  36. data/lib/{view_models/controller_extractor.rb → shared/lib/view_models/context_extractor.rb} +4 -2
  37. data/lib/{extensions → shared/lib/view_models/extensions}/active_record.rb +2 -0
  38. data/lib/{extensions → shared/lib/view_models/extensions}/model_reader.rb +1 -1
  39. data/lib/{helpers → shared/lib/view_models/helpers}/collection.rb +1 -13
  40. data/lib/{helpers/rails.rb → shared/lib/view_models/helpers/mapping.rb} +5 -1
  41. data/lib/{view_models → shared/lib/view_models}/path_store.rb +0 -0
  42. data/lib/{view_models → shared/lib/view_models}/render_options.rb +4 -0
  43. data/lib/view_models.rb +5 -3
  44. metadata +60 -109
  45. data/CHANGELOG +0 -26
  46. data/MIT-LICENSE +0 -20
  47. data/README.textile +0 -40
  48. data/Rakefile +0 -49
  49. data/VERSION.yml +0 -4
  50. data/generators/view_models/templates/views/view_models/collection/_list.html.haml +0 -7
  51. data/lib/experimental/README.textile +0 -32
  52. data/rails/init.rb +0 -18
  53. data/spec/integration/integration_spec.rb +0 -281
  54. data/spec/integration/models/sub_subclass.rb +0 -14
  55. data/spec/integration/models/subclass.rb +0 -3
  56. data/spec/integration/view_models/module_for_rendering.rb +0 -7
  57. data/spec/integration/view_models/project.rb +0 -14
  58. data/spec/integration/view_models/sub_subclass.rb +0 -42
  59. data/spec/integration/view_models/subclass.rb +0 -1
  60. data/spec/integration/views/view_models/collection/_collection.html.erb +0 -1
  61. data/spec/integration/views/view_models/collection/_collection.text.erb +0 -6
  62. data/spec/integration/views/view_models/collection/_list.html.erb +0 -1
  63. data/spec/integration/views/view_models/collection/_list.text.erb +0 -6
  64. data/spec/integration/views/view_models/module_for_rendering/_not_found_in_sub_subclass_but_in_module.erb +0 -1
  65. data/spec/integration/views/view_models/sub_subclass/_capture_in_template.erb +0 -2
  66. data/spec/integration/views/view_models/sub_subclass/_capture_in_view_model.erb +0 -3
  67. data/spec/integration/views/view_models/sub_subclass/_collection_example.html.erb +0 -3
  68. data/spec/integration/views/view_models/sub_subclass/_collection_example.text.erb +0 -3
  69. data/spec/integration/views/view_models/sub_subclass/_collection_item.html.erb +0 -1
  70. data/spec/integration/views/view_models/sub_subclass/_collection_item.text.erb +0 -1
  71. data/spec/integration/views/view_models/sub_subclass/_exists.erb +0 -1
  72. data/spec/integration/views/view_models/sub_subclass/_exists.html.erb +0 -1
  73. data/spec/integration/views/view_models/sub_subclass/_exists.text.erb +0 -1
  74. data/spec/integration/views/view_models/sub_subclass/_exists_in_both.erb +0 -1
  75. data/spec/integration/views/view_models/sub_subclass/_inner.also_explicit.erb +0 -1
  76. data/spec/integration/views/view_models/sub_subclass/_inner.nesting.erb +0 -1
  77. data/spec/integration/views/view_models/sub_subclass/_list_example.html.erb +0 -3
  78. data/spec/integration/views/view_models/sub_subclass/_list_example.text.erb +0 -3
  79. data/spec/integration/views/view_models/sub_subclass/_list_item.html.erb +0 -1
  80. data/spec/integration/views/view_models/sub_subclass/_list_item.text.erb +0 -1
  81. data/spec/integration/views/view_models/sub_subclass/_outer.explicit.erb +0 -1
  82. data/spec/integration/views/view_models/sub_subclass/_outer.nesting.erb +0 -1
  83. data/spec/integration/views/view_models/sub_subclass/_part_that_is_dependent_on_the_view_model.erb +0 -1
  84. data/spec/integration/views/view_models/sub_subclass/show.html.erb +0 -1
  85. data/spec/integration/views/view_models/sub_subclass/show.text.erb +0 -1
  86. data/spec/integration/views/view_models/subclass/_exists_in_both.erb +0 -1
  87. data/spec/integration/views/view_models/subclass/_no_sub_subclass.erb +0 -1
  88. data/spec/integration/views/view_models/subclass/_not_found_in_sub_subclass.erb +0 -1
  89. data/spec/lib/extensions/active_record_spec.rb +0 -31
  90. data/spec/lib/extensions/model_reader_spec.rb +0 -93
  91. data/spec/lib/helpers/collection_spec.rb +0 -196
  92. data/spec/lib/helpers/rails_spec.rb +0 -84
  93. data/spec/lib/helpers/view_spec.rb +0 -20
  94. data/spec/lib/view_models/base_spec.rb +0 -102
  95. data/spec/lib/view_models/view_spec.rb +0 -9
  96. data/spec/spec_helper.rb +0 -14
  97. data/spec/spec_helper_extensions.rb +0 -13
data/lib/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), '/view_models')
@@ -0,0 +1,3 @@
1
+ h1. View Models for Padrino
2
+
3
+ This is the Padrino specific folder of the view models.
@@ -0,0 +1,10 @@
1
+ this = File.dirname __FILE__
2
+
3
+ require File.join(this, '/../shared/init')
4
+
5
+ ViewModels::Helpers::Mapping
6
+
7
+ require File.join(this, '/lib/view_models/base')
8
+ require File.join(this, '/lib/helpers/collection')
9
+
10
+ require File.join(this, '/lib/padrino/view_models')
@@ -0,0 +1,27 @@
1
+ module ViewModels
2
+ module Helpers
3
+ module Mapping
4
+
5
+ # The Collection view_model helper has the purpose of presenting presentable collections.
6
+ # * Render as list
7
+ # * Render as table
8
+ # * Render as collection
9
+ # * Render a pagination
10
+ #
11
+ class Collection
12
+ private
13
+
14
+ # Helper method that renders a partial in the context of the context instance.
15
+ #
16
+ # Example:
17
+ # If the collection view_model helper has been instantiated in the context
18
+ # of a controller, render will be called in the controller.
19
+ #
20
+ def render_partial name, locals
21
+ @context.instance_eval { render "view_models/collection/_#{name}", :locals => locals }
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ module Padrino
2
+ module ViewModels
3
+
4
+ class << self
5
+ def registered app
6
+ app.send :include, ::ViewModels::Helpers::Mapping
7
+
8
+ Padrino.set_load_paths File.join(app.root, "/view_models")
9
+
10
+ Padrino.require_dependencies File.join(app.root, "/view_models.rb")
11
+ # FIXME Needs to require in a specific order.
12
+ #
13
+ Padrino.require_dependencies File.join(app.root, "/view_models/**/*.rb")
14
+ end
15
+ alias :included :registered
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,65 @@
1
+ # Base Module for Padrino ViewModels.
2
+ #
3
+ module ViewModels
4
+
5
+ # Base class from which all view_models inherit.
6
+ #
7
+ class Base
8
+
9
+ # Make helper and helper_method available
10
+ #
11
+ # TODO Rewrite Padrino style.
12
+ #
13
+ # include ActionController::Helpers
14
+
15
+ class << self
16
+
17
+ # Alias the context_method to the padrino-centric app_method.
18
+ #
19
+ alias app_method context_method
20
+
21
+ # Sets the view format and tries to render the given options.
22
+ #
23
+ # Note: Also caches [path, name, format] => template path.
24
+ #
25
+ def render renderer, options
26
+ # options.format! view
27
+ renderer.instance_variable_set(:@_content_type, options.format || :html)
28
+ path_store.cached options do
29
+ path = template_path renderer, options
30
+ options.file = path
31
+ renderer.send :render, path.to_s, options.to_render_options
32
+ end
33
+ end
34
+
35
+ # FIXME Need to use padrino register for this.
36
+ #
37
+ alias_method :register, :include
38
+
39
+ protected
40
+
41
+ # Accesses the view to find a suitable template path.
42
+ #
43
+ # Returns nil if a template cannot be found.
44
+ #
45
+ def template_path_from renderer, options
46
+ template = renderer.send :resolve_template, tentative_template_path(options)
47
+ # TODO!
48
+ #
49
+ template && template.first.to_s # was .path
50
+ rescue Padrino::Rendering::TemplateNotFound => t
51
+ nil
52
+ end
53
+
54
+ end
55
+
56
+ alias app context
57
+
58
+ protected
59
+
60
+ def renderer
61
+ app
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,3 @@
1
+ h1. View Models for Rails
2
+
3
+ This is the Rails specific folder of the view models.
File without changes
@@ -0,0 +1,18 @@
1
+ # require 'experimental/modules_in_render_hierarchy'
2
+
3
+ this = File.dirname __FILE__
4
+
5
+ require File.join(this, '/lib/view_models')
6
+ require File.join(this, '/../shared/init')
7
+ require File.join(this, '/lib/view_models/base')
8
+ require File.join(this, '/lib/view_models/view')
9
+
10
+ require File.join(this, '/lib/helpers/view')
11
+ require File.join(this, '/lib/helpers/collection')
12
+
13
+ # TODO How was the view models generator included?
14
+ #
15
+ # require File.join(this, '/generators/view_models/view_models_generator')
16
+
17
+ ActionController::Base.send :include, ViewModels::Helpers::Mapping
18
+ ActionView::Base.send :include, ViewModels::Helpers::Mapping
File without changes
@@ -0,0 +1,27 @@
1
+ module ViewModels
2
+ module Helpers
3
+ module Mapping
4
+
5
+ # The Collection view_model helper has the purpose of presenting presentable collections.
6
+ # * Render as list
7
+ # * Render as table
8
+ # * Render as collection
9
+ # * Render a pagination
10
+ #
11
+ class Collection
12
+ private
13
+
14
+ # Helper method that renders a partial in the context of the context instance.
15
+ #
16
+ # Example:
17
+ # If the collection view_model helper has been instantiated in the context
18
+ # of a controller, render will be called in the controller.
19
+ #
20
+ def render_partial name, locals
21
+ @context.instance_eval { render :partial => "view_models/collection/#{name}", :locals => locals }
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
File without changes
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), '/../../shared/lib/view_models')
@@ -0,0 +1,99 @@
1
+ # Base Module for Rails 2 ViewModels.
2
+ #
3
+ module ViewModels
4
+
5
+ # Base class from which all view_models inherit.
6
+ #
7
+ class Base
8
+
9
+ # Make helper and helper_method available
10
+ #
11
+ include ActionController::Helpers
12
+
13
+ # This is really only needed because some Rails helpers access
14
+ # @controller directly.
15
+ # It's really bad.
16
+ #
17
+ # TODO Make it call super.
18
+ #
19
+ def initialize model, controller_or_view
20
+ @model = model
21
+ @context = @controller = ContextExtractor.new(controller_or_view).extract
22
+ end
23
+
24
+ class << self
25
+
26
+ # Alias the context_method to the rails-centric controller_method.
27
+ #
28
+ alias controller_method context_method
29
+
30
+ # Wrapper for add_template_helper in ActionController::Helpers, also
31
+ # includes given helper in the view_model
32
+ #
33
+ # TODO extract into module
34
+ #
35
+ unless instance_methods.include?('old_add_template_helper')
36
+ alias old_add_template_helper add_template_helper
37
+ def add_template_helper helper_module
38
+ include helper_module
39
+ old_add_template_helper helper_module
40
+ end
41
+ end
42
+
43
+ # Sets the view format and tries to render the given options.
44
+ #
45
+ # Note: Also caches [path, name, format] => template path.
46
+ #
47
+ def render renderer, options
48
+ options.format! renderer
49
+ path_store.cached options do
50
+ options.file = template_path renderer, options
51
+ renderer.render_with options
52
+ end
53
+ end
54
+
55
+ protected
56
+
57
+ # Accesses the view to find a suitable template path.
58
+ #
59
+ def template_path_from renderer, options
60
+ template = renderer.find_template tentative_template_path(options)
61
+
62
+ template && template.path
63
+ end
64
+
65
+ end # class << self
66
+
67
+ # Delegate context methods.
68
+ #
69
+ context_method :form_authenticity_token, :protect_against_forgery?, :request_forgery_protection_token
70
+
71
+ # Make all the dynamically generated routes (restful routes etc.)
72
+ # available in the view_model
73
+ #
74
+ ActionController::Routing::Routes.install_helpers self
75
+
76
+ protected
77
+
78
+ alias controller context
79
+
80
+ # CaptureHelper needs this.
81
+ #
82
+ attr_accessor :output_buffer
83
+
84
+ # Returns a view instance for render_xxx.
85
+ #
86
+ # TODO Try getting a view instance from the controller.
87
+ #
88
+ def renderer
89
+ # view = if controller.response.template
90
+ # controller.response.template
91
+ # else
92
+ View.new controller, master_helper_module
93
+ # end
94
+
95
+ # view.extend Extensions::View
96
+ end
97
+
98
+ end
99
+ end
@@ -3,10 +3,14 @@ module ViewModels
3
3
  #
4
4
  class View < ActionView::Base
5
5
 
6
+ # Shut up, opinionated funkers.
7
+ #
8
+ alias singleton_class metaclass unless instance_methods.include?('singleton_class')
9
+
6
10
  # Include the helpers from the view model.
7
11
  #
8
12
  def initialize controller, master_helper_module
9
- metaclass.send :include, master_helper_module
13
+ singleton_class.send :include, master_helper_module
10
14
  super controller.class.view_paths, {}, controller
11
15
  end
12
16
 
@@ -0,0 +1,3 @@
1
+ h1. View Models for Padrino AND Rails
2
+
3
+ This is shared folder which contains code and resources both for Padrino AND Rails.
@@ -0,0 +1,11 @@
1
+ require File.join(File.dirname(__FILE__), '/lib/view_models/extensions/active_record')
2
+ require File.join(File.dirname(__FILE__), '/lib/view_models/extensions/model_reader')
3
+
4
+ require File.join(File.dirname(__FILE__), '/lib/view_models')
5
+ require File.join(File.dirname(__FILE__), '/lib/view_models/path_store')
6
+ require File.join(File.dirname(__FILE__), '/lib/view_models/render_options')
7
+ require File.join(File.dirname(__FILE__), '/lib/view_models/context_extractor')
8
+ require File.join(File.dirname(__FILE__), '/lib/view_models/base')
9
+
10
+ require File.join(File.dirname(__FILE__), '/lib/view_models/helpers/mapping')
11
+ require File.join(File.dirname(__FILE__), '/lib/view_models/helpers/collection')
@@ -0,0 +1,4 @@
1
+ require 'active_support'
2
+
3
+ module ViewModels; end
4
+ module ViewModels; module Helpers; end; end
@@ -11,22 +11,14 @@ module ViewModels
11
11
  #
12
12
  class Base
13
13
 
14
- # Model and Controller are accessible from outside.
15
- #
16
- # TODO but they actually shouldn't be. Try to migrate into protected area.
17
- #
18
- attr_reader :model, :controller
19
-
20
- # Make helper and helper_method available
21
- #
22
- include ActionController::Helpers
23
-
24
14
  # Create a view_model. To create a view_model, you need to have a model (to present) and a context.
25
- # The context is usually a view or a controller, but doesn't need to be.
15
+ # The context is usually a view, a controller, or an app, but doesn't need to be.
16
+ #
17
+ # TODO Include this.
26
18
  #
27
- def initialize model, context
28
- @model = model
29
- @controller = ControllerExtractor.new(context).extract
19
+ def initialize model, app_or_controller_or_view
20
+ @model = model
21
+ @context = ContextExtractor.new(app_or_controller_or_view).extract
30
22
  end
31
23
 
32
24
  class << self
@@ -42,51 +34,31 @@ module ViewModels
42
34
  super
43
35
  end
44
36
 
45
- # Installs the model_reader Method for filtered
46
- # model method delegation.
47
- #
48
- include Extensions::ModelReader
49
-
50
- # Delegates method calls to the controller.
37
+ # Delegates method calls to the context.
51
38
  #
52
39
  # Examples:
53
- # controller_method :current_user
54
- # controller_method :current_user, :current_profile # multiple methods to be delegated
40
+ # context_method :current_user
41
+ # context_method :current_user, :current_profile # multiple methods to be delegated
55
42
  #
56
43
  # In the view_model:
57
44
  # self.current_user
58
45
  # will call
59
- # controller.current_user
46
+ # context.current_user
60
47
  #
61
- def controller_method *methods
62
- delegate *methods << { :to => :controller }
48
+ def context_method *methods
49
+ delegate *methods << { :to => :context }
63
50
  end
64
51
 
65
- # Wrapper for add_template_helper in ActionController::Helpers, also
66
- # includes given helper in the view_model
67
- #
68
- # TODO extract into module
69
- #
70
- alias old_add_template_helper add_template_helper
71
- def add_template_helper helper_module
72
- include helper_module
73
- old_add_template_helper helper_module
74
- end
75
-
76
- # Sets the view format and tries to render the given options.
77
- #
78
- # Note: Also caches [path, name, format] => template path.
52
+ # Installs the model_reader Method for filtered
53
+ # model method delegation.
79
54
  #
80
- def render view, options
81
- options.format! view
82
- path_store.cached options do
83
- options.file = template_path view, options
84
- view.render_with options
85
- end
86
- end
55
+ include Extensions::ModelReader
87
56
 
88
57
  protected
89
58
 
59
+ # Hierarchical rendering.
60
+ #
61
+
90
62
  # Returns the next view model class in the render hierarchy.
91
63
  #
92
64
  # Note: Just returns the superclass.
@@ -96,13 +68,11 @@ module ViewModels
96
68
  def next_in_render_hierarchy
97
69
  superclass
98
70
  end
99
-
100
71
  # Just raises a fitting template error.
101
72
  #
102
73
  def raise_template_error_with message
103
74
  raise MissingTemplateError.new "No template #{message} found."
104
75
  end
105
-
106
76
  # Check if the view lookup inheritance chain has ended.
107
77
  #
108
78
  # Raises a MissingTemplateError if yes.
@@ -111,6 +81,10 @@ module ViewModels
111
81
  self == ViewModels::Base
112
82
  end
113
83
 
84
+
85
+ # Template finding
86
+ #
87
+
114
88
  # Returns a template path for the view with the given options.
115
89
  #
116
90
  # If no template is found, traverses up the inheritance chain.
@@ -118,24 +92,20 @@ module ViewModels
118
92
  # Raises a MissingTemplateError if none is found during
119
93
  # inheritance chain traversal.
120
94
  #
121
- def template_path view, options
95
+ def template_path renderer, options
122
96
  raise_template_error_with options.error_message if inheritance_chain_ends?
123
97
 
124
- template_path_from(view, options) || self.next_in_render_hierarchy.template_path(view, options)
98
+ template_path_from(renderer, options) || self.next_in_render_hierarchy.template_path(renderer, options)
125
99
  end
126
100
 
127
- # Accesses the view to find a suitable template path.
128
- #
129
- def template_path_from view, options
130
- template = view.find_template tentative_template_path(options)
131
-
132
- template && template.path
133
- end
101
+ # ...
134
102
 
135
103
  # Return as render path either a stored path or a newly generated one.
136
104
  #
137
105
  # If nothing or nil is passed, the store is ignored.
138
106
  #
107
+ # TODO Think about using the built-in Padrino template store.
108
+ #
139
109
  def tentative_template_path options
140
110
  path_store[options.path_key] || generate_template_path_from(options)
141
111
  end
@@ -168,22 +138,17 @@ module ViewModels
168
138
  @view_model_path || @view_model_path = self.name.underscore
169
139
  end
170
140
 
171
- end # class << self
172
-
173
- # Delegate controller methods.
174
- #
175
- controller_method :logger, :form_authenticity_token, :protect_against_forgery?, :request_forgery_protection_token
141
+ end
176
142
 
177
- # Make all the dynamically generated routes (restful routes etc.)
178
- # available in the view_model
143
+ # Delegate context methods.
179
144
  #
180
- ActionController::Routing::Routes.install_helpers self
145
+ context_method :logger
181
146
 
182
147
  # Renders the given partial in the view_model's view root in the format given.
183
148
  #
184
149
  # Example:
185
- # app/views/view_models/this/view_model/_partial.haml
186
- # app/views/view_models/this/view_model/_partial.text.erb
150
+ # views/view_models/this/view_model/_partial.haml
151
+ # views/view_models/this/view_model/_partial.text.erb
187
152
  #
188
153
  # The following options are supported:
189
154
  # * :format - Calling view_model.render_as('partial') will render the haml
@@ -194,7 +159,7 @@ module ViewModels
194
159
  # * If no format is given, it will render the default format, which is (currently) html.
195
160
  #
196
161
  def render_as name, options = {}
197
- render RenderOptions::Partial.new(name, options)
162
+ render_internal RenderOptions::Partial.new(name, options)
198
163
  end
199
164
  # render_the is used for small parts.
200
165
  #
@@ -208,8 +173,8 @@ module ViewModels
208
173
  # Renders the given template in the view_model's view root in the format given.
209
174
  #
210
175
  # Example:
211
- # app/views/view_models/this/view_model/template.haml
212
- # app/views/view_models/this/view_model/template name.text.erb
176
+ # views/view_models/this/view_model/template.haml
177
+ # views/view_models/this/view_model/template name.text.erb
213
178
  #
214
179
  # The following options are supported:
215
180
  # * :format - Calling view_model.render_template('template') will render the haml
@@ -220,38 +185,29 @@ module ViewModels
220
185
  # * If no format is given, it will render the default format, which is (currently) html.
221
186
  #
222
187
  def render_template name, options = {}
223
- render RenderOptions::Template.new(name, options)
188
+ render_internal RenderOptions::Template.new(name, options)
224
189
  end
225
190
 
226
191
  protected
227
192
 
228
- # CaptureHelper needs this.
193
+ # Model and Context (Controller) are accessible from a view model.
194
+ #
195
+ # If you really need to call
196
+ # view_model.model.bla
197
+ # in a view, I urge you to reconsider. But feel free to make
198
+ # the methods model, controller, context public.
229
199
  #
230
- attr_accessor :output_buffer
200
+ attr_reader :model, :context
231
201
 
232
202
  # Internal render method that uses the options to get a view instance
233
203
  # and then referring to its class for rendering.
234
204
  #
235
- def render options
205
+ def render_internal options
236
206
  options.view_model = self
237
207
 
238
208
  determine_and_set_format options
239
-
240
- self.class.render view_instance, options
241
- end
242
-
243
- # Returns a view instance for render_xxx.
244
- #
245
- # TODO Try getting a view instance from the controller.
246
- #
247
- def view_instance
248
- # view = if controller.response.template
249
- # controller.response.template
250
- # else
251
- View.new controller, master_helper_module
252
- # end
253
-
254
- # view.extend Extensions::View
209
+
210
+ self.class.render renderer, options
255
211
  end
256
212
 
257
213
  # Determines what format to use for rendering.
@@ -263,6 +219,5 @@ module ViewModels
263
219
  def determine_and_set_format options
264
220
  options.format = @template_format = options.format || @template_format
265
221
  end
266
-
267
222
  end
268
223
  end