hobo 0.8.5 → 0.8.6
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.
- data/CHANGES.txt +41 -0
- data/Manifest +1 -5
- data/Rakefile +10 -3
- data/bin/hobo +38 -15
- data/dryml_generators/rapid/cards.dryml.erb +7 -7
- data/dryml_generators/rapid/pages.dryml.erb +52 -24
- data/hobo.gemspec +42 -322
- data/init.rb +0 -7
- data/lib/active_record/association_collection.rb +9 -0
- data/lib/hobo.rb +13 -14
- data/lib/hobo/accessible_associations.rb +32 -7
- data/lib/hobo/authentication_support.rb +1 -1
- data/lib/hobo/controller.rb +5 -7
- data/lib/hobo/dryml.rb +9 -2
- data/lib/hobo/dryml/dryml_builder.rb +11 -12
- data/lib/hobo/dryml/dryml_doc.rb +22 -24
- data/lib/hobo/dryml/dryml_generator.rb +41 -4
- data/lib/hobo/dryml/part_context.rb +5 -3
- data/lib/hobo/dryml/template.rb +7 -7
- data/lib/hobo/dryml/template_environment.rb +11 -22
- data/lib/hobo/dryml/template_handler.rb +94 -25
- data/lib/hobo/find_for.rb +2 -2
- data/lib/hobo/hobo_helper.rb +21 -21
- data/lib/hobo/include_in_save.rb +9 -5
- data/lib/hobo/lifecycles/transition.rb +2 -2
- data/lib/hobo/model.rb +11 -61
- data/lib/hobo/model_controller.rb +28 -29
- data/lib/hobo/model_router.rb +12 -13
- data/lib/hobo/permissions.rb +47 -37
- data/lib/hobo/permissions/associations.rb +1 -1
- data/lib/hobo/scopes/association_proxy_extensions.rb +5 -6
- data/lib/hobo/scopes/automatic_scopes.rb +7 -4
- data/lib/hobo/tasks/rails.rb +4 -0
- data/lib/hobo/user.rb +0 -1
- data/lib/hobo/user_controller.rb +3 -1
- data/lib/hobo/view_hints.rb +17 -3
- data/rails_generators/hobo/hobo_generator.rb +1 -0
- data/rails_generators/hobo_front_controller/templates/functional_test.rb +1 -11
- data/rails_generators/hobo_front_controller/templates/index.dryml +1 -6
- data/rails_generators/hobo_rapid/hobo_rapid_generator.rb +1 -0
- data/rails_generators/hobo_rapid/templates/hobo-rapid.css +3 -2
- data/rails_generators/hobo_rapid/templates/hobo-rapid.js +24 -15
- data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/clean.css +17 -12
- data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid-ui.css +6 -2
- data/rails_generators/hobo_rapid/templates/themes/clean/views/clean.dryml +2 -2
- data/rails_generators/hobo_user_model/templates/forgot_password.erb +2 -2
- data/rails_generators/hobo_user_model/templates/model.rb +2 -2
- data/taglibs/rapid.dryml +3 -2
- data/taglibs/rapid_core.dryml +21 -16
- data/taglibs/rapid_document_tags.dryml +1 -1
- data/taglibs/rapid_editing.dryml +7 -10
- data/taglibs/rapid_forms.dryml +115 -26
- data/taglibs/rapid_generics.dryml +13 -3
- data/taglibs/rapid_lifecycles.dryml +18 -1
- data/taglibs/rapid_navigation.dryml +50 -61
- data/taglibs/rapid_pages.dryml +103 -19
- data/taglibs/rapid_plus.dryml +54 -6
- data/taglibs/rapid_support.dryml +38 -1
- data/taglibs/rapid_user_pages.dryml +17 -5
- data/test/permissions/models/models.rb +24 -12
- data/test/permissions/models/test.sqlite3 +0 -0
- metadata +6 -15
- data/lib/extensions/test_case.rb +0 -129
- data/lib/hobo/composite_model.rb +0 -73
- data/lib/hobo/model_support.rb +0 -44
- data/tasks/fix_dryml.rake +0 -143
- data/tasks/generate_tag_reference.rake +0 -192
- data/test/dryml/complilation_test.rb +0 -261
data/lib/hobo/dryml/template.rb
CHANGED
@@ -193,7 +193,7 @@ module Hobo::Dryml
|
|
193
193
|
def set_element(el)
|
194
194
|
assigns = el.attributes.map do |name, value|
|
195
195
|
next if name.in?(SPECIAL_ATTRIBUTES)
|
196
|
-
dryml_exception("invalid name in <set>", el) unless name =~ /^#{DRYML_NAME}(\.#{DRYML_NAME})*$/
|
196
|
+
dryml_exception("invalid name in <set> (remember to use '-' rather than '_')", el) unless name =~ /^#{DRYML_NAME}(\.#{DRYML_NAME})*$/
|
197
197
|
"#{ruby_name name} = #{attribute_to_ruby(value)}; "
|
198
198
|
end.join
|
199
199
|
code = apply_control_attributes("begin; #{assigns}; end", el)
|
@@ -203,7 +203,7 @@ module Hobo::Dryml
|
|
203
203
|
|
204
204
|
def set_scoped_element(el)
|
205
205
|
variables = el.attributes.map do |name, value|
|
206
|
-
dryml_exception("invalid name in <set-scoped>", el) unless name =~ DRYML_NAME_RX
|
206
|
+
dryml_exception("invalid name in <set-scoped> (remember to use '-' rather than '_')", el) unless name =~ DRYML_NAME_RX
|
207
207
|
":#{ruby_name name} => #{attribute_to_ruby(value)} "
|
208
208
|
end
|
209
209
|
"<% scope.new_scope(#{variables * ', '}) { #{tag_newlines(el)} %>#{children_to_erb(el)}<% } %>"
|
@@ -367,7 +367,7 @@ module Hobo::Dryml
|
|
367
367
|
# reproduce any line breaks in the start-tag so that line numbers are preserved
|
368
368
|
tag_newlines(el) + "%>" +
|
369
369
|
wrap_tag_method_body_with_metadata(children_to_erb(el)) +
|
370
|
-
"<%
|
370
|
+
"<% output_buffer; end"
|
371
371
|
end
|
372
372
|
|
373
373
|
|
@@ -576,7 +576,7 @@ module Hobo::Dryml
|
|
576
576
|
end
|
577
577
|
|
578
578
|
call = apply_control_attributes(call, el)
|
579
|
-
call = maybe_make_part_call(el, "<%
|
579
|
+
call = maybe_make_part_call(el, "<% concat(#{call}) %>")
|
580
580
|
wrap_tag_call_with_metadata(el, call)
|
581
581
|
end
|
582
582
|
|
@@ -678,7 +678,7 @@ module Hobo::Dryml
|
|
678
678
|
def before_parameter_tag_hash_item(name, el, metadata_name)
|
679
679
|
param_name = get_param_name(el)
|
680
680
|
dryml_exception("param declaration not allowed on 'before' parameters", el) if param_name
|
681
|
-
content = children_to_erb(el) + "<%
|
681
|
+
content = children_to_erb(el) + "<% concat(#{param_restore_local_name(name)}.call({}, {})) %>"
|
682
682
|
":#{ruby_name name}_replacement => #{replace_parameter_proc(el, metadata_name, content)}"
|
683
683
|
end
|
684
684
|
|
@@ -686,7 +686,7 @@ module Hobo::Dryml
|
|
686
686
|
def after_parameter_tag_hash_item(name, el, metadata_name)
|
687
687
|
param_name = get_param_name(el)
|
688
688
|
dryml_exception("param declaration not allowed on 'after' parameters", el) if param_name
|
689
|
-
content = "<%
|
689
|
+
content = "<% concat(#{param_restore_local_name(name)}.call({}, {})) %>" + children_to_erb(el)
|
690
690
|
":#{ruby_name name}_replacement => #{replace_parameter_proc(el, metadata_name, content)}"
|
691
691
|
end
|
692
692
|
|
@@ -851,7 +851,7 @@ module Hobo::Dryml
|
|
851
851
|
end
|
852
852
|
|
853
853
|
output_tag = "element(:#{el.name}, #{attrs}, new_context { %>#{body}<% })"
|
854
|
-
"<%
|
854
|
+
"<% concat(" + apply_control_attributes(output_tag, el) + ") %>"
|
855
855
|
end
|
856
856
|
end
|
857
857
|
|
@@ -240,24 +240,13 @@ module Hobo::Dryml
|
|
240
240
|
end
|
241
241
|
|
242
242
|
|
243
|
-
def _erbout
|
244
|
-
@_erb_output
|
245
|
-
end
|
246
|
-
|
247
|
-
|
248
|
-
def _output(s)
|
249
|
-
@_erb_output.concat(s)
|
250
|
-
end
|
251
|
-
|
252
|
-
|
253
243
|
def new_context
|
254
|
-
ctx = [ @
|
255
|
-
@
|
256
|
-
@_form_field_path ]
|
257
|
-
@_erb_output = ""
|
244
|
+
ctx = [ @_this, @_this_parent, @_this_field, @_this_type,
|
245
|
+
@_form_field_path, @_form_field_paths_by_object ]
|
258
246
|
@_this_type = nil
|
259
|
-
res =
|
260
|
-
@
|
247
|
+
res = nil
|
248
|
+
@view.with_output_buffer { res = yield }
|
249
|
+
@_this, @_this_parent, @_this_field, @_this_type, @_form_field_path, @_form_field_paths_by_object = ctx
|
261
250
|
res.to_s
|
262
251
|
end
|
263
252
|
|
@@ -374,7 +363,7 @@ module Hobo::Dryml
|
|
374
363
|
|
375
364
|
|
376
365
|
def call_tag_parameter_with_default_content(the_tag, attributes, default_content, overriding_content_proc)
|
377
|
-
if the_tag.
|
366
|
+
if the_tag.is_one_of?(String, Symbol) && the_tag.to_s.in?(Hobo.static_tags)
|
378
367
|
body = if overriding_content_proc
|
379
368
|
new_context { overriding_content_proc.call(proc { default_content._?.call(nil) }) }
|
380
369
|
elsif default_content
|
@@ -451,7 +440,7 @@ module Hobo::Dryml
|
|
451
440
|
|
452
441
|
default_content = parameters[:default]
|
453
442
|
|
454
|
-
if the_tag.
|
443
|
+
if the_tag.is_one_of?(String, Symbol) && the_tag.to_s.in?(Hobo.static_tags)
|
455
444
|
body = if overriding_default_content
|
456
445
|
new_context { overriding_default_content.call(proc { default_content.call(nil) if default_content }) }
|
457
446
|
elsif default_content
|
@@ -470,7 +459,7 @@ module Hobo::Dryml
|
|
470
459
|
parameters = parameters.merge(:default => d)
|
471
460
|
end
|
472
461
|
|
473
|
-
if the_tag.
|
462
|
+
if the_tag.is_one_of?(String, Symbol)
|
474
463
|
# It's a defined DRYML tag
|
475
464
|
send(the_tag, attributes, parameters)
|
476
465
|
else
|
@@ -508,7 +497,7 @@ module Hobo::Dryml
|
|
508
497
|
params[:default] =
|
509
498
|
if general_parameters[:default]
|
510
499
|
proc do |default|
|
511
|
-
overriding_default.call(proc { new_context {
|
500
|
+
overriding_default.call(proc { new_context { concat(general_parameters[:default].call(default)) } } )
|
512
501
|
end
|
513
502
|
else
|
514
503
|
proc do |default|
|
@@ -598,8 +587,8 @@ module Hobo::Dryml
|
|
598
587
|
else
|
599
588
|
"<#{name}#{attr_string}>#{content}</#{name}>"
|
600
589
|
end
|
601
|
-
if
|
602
|
-
|
590
|
+
if block_called_from_erb? block
|
591
|
+
concat res
|
603
592
|
else
|
604
593
|
res
|
605
594
|
end
|
@@ -60,24 +60,41 @@ module ActionController
|
|
60
60
|
text = call_dryml_tag(tag, attributes)
|
61
61
|
text && render({:text => text, :layout => false }.merge(options))
|
62
62
|
end
|
63
|
-
|
64
|
-
|
63
|
+
|
65
64
|
# DRYML fallback tags -- monkey patch this method to attempt to render a tag if there's no template
|
66
|
-
def render_for_file_with_dryml(
|
67
|
-
|
68
|
-
|
69
|
-
#
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
65
|
+
def render_for_file_with_dryml(template, status = nil, layout = nil, locals = {})
|
66
|
+
# in rails 2.2, "template" is actually "template_path"
|
67
|
+
|
68
|
+
# if we're passed a MissingTemplateWrapper, see if there's a
|
69
|
+
# dryml tag that will render the page
|
70
|
+
if template.respond_to? :original_template_path
|
71
|
+
# this is the Rails 2.3 path
|
72
|
+
tag_name = @dryml_fallback_tag || "#{File.basename(template.original_template_path).dasherize}-page"
|
73
|
+
|
74
|
+
text = call_dryml_tag(tag_name)
|
75
|
+
if text
|
76
|
+
return render_for_text text, status
|
77
|
+
else
|
78
|
+
template.raise_wrapped_exception
|
79
|
+
end
|
75
80
|
else
|
76
|
-
|
81
|
+
begin
|
82
|
+
result = render_for_file_without_dryml(template, status, layout, locals)
|
83
|
+
rescue ActionView::MissingTemplate => ex
|
84
|
+
# this is the Rails 2.2 path
|
85
|
+
tag_name = @dryml_fallback_tag || "#{File.basename(template).dasherize}-page"
|
86
|
+
|
87
|
+
text = call_dryml_tag(tag_name)
|
88
|
+
if text
|
89
|
+
return render_for_text text, status
|
90
|
+
else
|
91
|
+
raise ex
|
92
|
+
end
|
93
|
+
end
|
77
94
|
end
|
78
95
|
end
|
79
96
|
alias_method_chain :render_for_file, :dryml
|
80
|
-
|
97
|
+
|
81
98
|
end
|
82
99
|
end
|
83
100
|
|
@@ -96,22 +113,74 @@ class ActionView::Template
|
|
96
113
|
# from trying to compile our template. DRYML templates are each compiled as a class, not just a method,
|
97
114
|
# so the support for compiling templates that Rails provides is innadequate.
|
98
115
|
def render_dryml(view, local_assigns = {})
|
99
|
-
|
100
|
-
|
116
|
+
if view.instance_variable_defined?(:@_render_stack)
|
117
|
+
# Rails 2.2
|
118
|
+
stack = view.instance_variable_get(:@_render_stack)
|
119
|
+
stack.push(self)
|
120
|
+
|
121
|
+
# This is only used for TestResponse to set rendered_template
|
122
|
+
unless is_a?(ActionView::InlineTemplate) || view.instance_variable_get(:@_first_render)
|
123
|
+
view.instance_variable_set(:@_first_render, self)
|
124
|
+
end
|
101
125
|
|
102
|
-
|
103
|
-
|
104
|
-
|
126
|
+
view.send(:_evaluate_assigns_and_ivars)
|
127
|
+
view.send(:_set_controller_content_type, mime_type) if respond_to?(:mime_type)
|
128
|
+
|
129
|
+
result = Hobo::Dryml::TemplateHandler.new.render_for_rails22(self, view, local_assigns)
|
130
|
+
|
131
|
+
stack.pop
|
132
|
+
result
|
133
|
+
else
|
134
|
+
# Rails 2.3
|
135
|
+
compile(local_assigns)
|
136
|
+
|
137
|
+
view.with_template self do
|
138
|
+
view.send(:_evaluate_assigns_and_ivars)
|
139
|
+
view.send(:_set_controller_content_type, mime_type) if respond_to?(:mime_type)
|
140
|
+
|
141
|
+
Hobo::Dryml::TemplateHandler.new.render_for_rails22(self, view, local_assigns)
|
142
|
+
end
|
105
143
|
end
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
106
147
|
|
107
|
-
|
108
|
-
|
148
|
+
# this is only used in Rails 2.3
|
149
|
+
class MissingTemplateWrapper
|
150
|
+
attr_reader :original_template_path
|
151
|
+
|
152
|
+
def initialize(exception, path)
|
153
|
+
@exception = exception
|
154
|
+
@original_template_path = path
|
155
|
+
end
|
109
156
|
|
110
|
-
|
157
|
+
def method_missing(*args)
|
158
|
+
raise @exception
|
159
|
+
end
|
111
160
|
|
112
|
-
|
113
|
-
|
161
|
+
def render
|
162
|
+
raise @exception
|
114
163
|
end
|
164
|
+
end
|
115
165
|
|
116
|
-
|
117
|
-
|
166
|
+
|
167
|
+
module ActionView
|
168
|
+
class PathSet < Array
|
169
|
+
# this is only used by Rails 2.3
|
170
|
+
def find_template_with_dryml(original_template_path, format = nil, html_fallback = true)
|
171
|
+
begin
|
172
|
+
find_template_without_dryml(original_template_path, format, html_fallback)
|
173
|
+
rescue ActionView::MissingTemplate => ex
|
174
|
+
# instead of throwing the exception right away, hand back a
|
175
|
+
# time bomb instead. It'll blow if mishandled...
|
176
|
+
return MissingTemplateWrapper.new(ex, original_template_path)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
if instance_methods.include? "find_template"
|
181
|
+
# only rails 2.3 has this function
|
182
|
+
alias_method_chain :find_template, :dryml
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
data/lib/hobo/find_for.rb
CHANGED
@@ -33,13 +33,13 @@ module Hobo
|
|
33
33
|
# result
|
34
34
|
# end
|
35
35
|
#}
|
36
|
-
|
36
|
+
|
37
37
|
self.class.class_eval %{
|
38
38
|
def #{name}
|
39
39
|
Hobo::FindFor::Finder.new(self, '#{name}', :#{collection_name}, :#{anchor_association_name})
|
40
40
|
end
|
41
41
|
}
|
42
|
-
|
42
|
+
|
43
43
|
return send(name, *args)
|
44
44
|
end
|
45
45
|
end
|
data/lib/hobo/hobo_helper.rb
CHANGED
@@ -124,7 +124,7 @@ module Hobo
|
|
124
124
|
elsif obj.is_a? Hobo::RawJs
|
125
125
|
"#{name}=' + #{obj} + '"
|
126
126
|
else
|
127
|
-
v = if obj.
|
127
|
+
v = if obj.is_one_of?(ActiveRecord::Base, Array)
|
128
128
|
"@" + typed_id(obj)
|
129
129
|
else
|
130
130
|
obj.to_s.gsub("'"){"\\'"}
|
@@ -286,7 +286,7 @@ module Hobo
|
|
286
286
|
else
|
287
287
|
object = this
|
288
288
|
end
|
289
|
-
elsif args.first.
|
289
|
+
elsif args.first.is_one_of?(String, Symbol)
|
290
290
|
object = this
|
291
291
|
field = args.first
|
292
292
|
else
|
@@ -305,11 +305,11 @@ module Hobo
|
|
305
305
|
|
306
306
|
@can_view_cache ||= {}
|
307
307
|
@can_view_cache[ [object, field] ] ||=
|
308
|
-
if !object.respond_to?(:viewable_by)
|
308
|
+
if !object.respond_to?(:viewable_by?)
|
309
309
|
true
|
310
310
|
elsif object.viewable_by?(current_user, field)
|
311
311
|
# If possible, we also check if the current *value* of the field is viewable
|
312
|
-
if field.
|
312
|
+
if field.is_one_of?(Symbol, String) && (v = object.send(field)) && v.respond_to?(:viewable_by?)
|
313
313
|
v.viewable_by?(current_user, nil)
|
314
314
|
else
|
315
315
|
true
|
@@ -320,7 +320,6 @@ module Hobo
|
|
320
320
|
end
|
321
321
|
|
322
322
|
|
323
|
-
|
324
323
|
def select_viewable(collection=this)
|
325
324
|
collection.select {|x| can_view?(x)}
|
326
325
|
end
|
@@ -351,7 +350,7 @@ module Hobo
|
|
351
350
|
|
352
351
|
|
353
352
|
def param_name_for(path)
|
354
|
-
field_path = field_path.to_s.split(".") if field_path.
|
353
|
+
field_path = field_path.to_s.split(".") if field_path.is_one_of?(String, Symbol)
|
355
354
|
attrs = path.rest.map{|part| "[#{part.to_s.sub /\?$/, ''}]"}.join
|
356
355
|
"#{path.first}#{attrs}"
|
357
356
|
end
|
@@ -382,7 +381,11 @@ module Hobo
|
|
382
381
|
|
383
382
|
def new_for_current_user(model_or_assoc=nil)
|
384
383
|
model_or_assoc ||= this
|
385
|
-
model_or_assoc.
|
384
|
+
if model_or_assoc.respond_to?(:new_candidate)
|
385
|
+
model_or_assoc.user_new_candidate(current_user)
|
386
|
+
else
|
387
|
+
model_or_assoc.user_new(current_user)
|
388
|
+
end
|
386
389
|
end
|
387
390
|
|
388
391
|
|
@@ -439,6 +442,7 @@ module Hobo
|
|
439
442
|
result
|
440
443
|
end
|
441
444
|
|
445
|
+
|
442
446
|
def linkable?(*args)
|
443
447
|
options = args.extract_options!
|
444
448
|
target = args.empty? || args.first.is_a?(Symbol) ? this : args.shift
|
@@ -462,37 +466,33 @@ module Hobo
|
|
462
466
|
Hobo::ModelRouter.linkable?(klass, action, options.reverse_merge(:subsite => subsite))
|
463
467
|
end
|
464
468
|
|
469
|
+
|
465
470
|
def css_data(name, *args)
|
466
471
|
"#{name.to_s.dasherize}::#{args * '::'}"
|
467
472
|
end
|
468
|
-
|
469
|
-
|
470
|
-
# Convenience helper for the default app
|
473
|
+
|
471
474
|
|
472
|
-
#
|
473
|
-
def front_models
|
474
|
-
Hobo::Model.all_models.select {|m| linkable?(m) }
|
475
|
-
end
|
476
|
-
|
475
|
+
# --- ViewHint Helpers --- #
|
477
476
|
|
478
|
-
def this_field_name
|
479
|
-
this_parent.class.view_hints.field_name(this_field)
|
477
|
+
def this_field_name
|
478
|
+
this_parent.class.try.view_hints.try.field_name(this_field) || this_field
|
480
479
|
end
|
481
480
|
|
482
481
|
def this_field_help
|
483
|
-
this_parent.class.view_hints.field_help[this_field.to_sym]
|
482
|
+
this_parent.class.try.view_hints.try.field_help[this_field.to_sym]
|
484
483
|
end
|
485
484
|
|
486
485
|
|
487
|
-
#
|
486
|
+
# --- Debugging Helpers ---- #
|
488
487
|
|
489
488
|
def abort_with(*args)
|
490
|
-
raise args.
|
489
|
+
raise args.*.pretty_inspect.join("-------\n")
|
491
490
|
end
|
492
491
|
|
493
492
|
def log_debug(*args)
|
493
|
+
return if not logger
|
494
494
|
logger.debug("\n### DRYML Debug ###")
|
495
|
-
logger.debug(args.
|
495
|
+
logger.debug(args.*.pretty_inspect.join("-------\n"))
|
496
496
|
logger.debug("DRYML THIS = #{this.typed_id rescue this.inspect}")
|
497
497
|
logger.debug("###################\n")
|
498
498
|
args.first unless args.empty?
|
data/lib/hobo/include_in_save.rb
CHANGED
@@ -19,10 +19,13 @@ module Hobo
|
|
19
19
|
added = false
|
20
20
|
records.each do |record|
|
21
21
|
# we want to call valid? on each one, but only add the error to self once
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
added
|
22
|
+
|
23
|
+
record.with_acting_user(acting_user) do
|
24
|
+
unless record.valid?
|
25
|
+
unless added
|
26
|
+
errors.add association, "..."
|
27
|
+
added = true
|
28
|
+
end
|
26
29
|
end
|
27
30
|
end
|
28
31
|
end
|
@@ -35,7 +38,8 @@ module Hobo
|
|
35
38
|
if included_in_save
|
36
39
|
included_in_save.each_pair do |association, records|
|
37
40
|
records.each do |record|
|
38
|
-
|
41
|
+
# save_without_validation means without transactions too
|
42
|
+
record.with_acting_user(acting_user) { record.save_without_validation }
|
39
43
|
end
|
40
44
|
end
|
41
45
|
end
|
@@ -20,7 +20,7 @@ module Hobo
|
|
20
20
|
|
21
21
|
|
22
22
|
def extract_attributes(attributes)
|
23
|
-
update_attributes = options.fetch(:
|
23
|
+
update_attributes = options.fetch(:params, [])
|
24
24
|
attributes & update_attributes
|
25
25
|
end
|
26
26
|
|
@@ -50,7 +50,7 @@ module Hobo
|
|
50
50
|
|
51
51
|
|
52
52
|
def parameters
|
53
|
-
options[:
|
53
|
+
options[:params] || []
|
54
54
|
end
|
55
55
|
|
56
56
|
|