hobo 2.0.1 → 2.1.0.pre1

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 (32) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES-2.1.markdown +57 -0
  3. data/Gemfile +1 -1
  4. data/VERSION +1 -1
  5. data/app/helpers/hobo_permissions_helper.rb +1 -1
  6. data/app/helpers/hobo_route_helper.rb +10 -79
  7. data/config/routes.rb +2 -2
  8. data/hobo.gemspec +1 -1
  9. data/lib/generators/hobo/admin_subsite/admin_subsite_generator.rb +3 -1
  10. data/lib/generators/hobo/controller.rb +4 -1
  11. data/lib/generators/hobo/front_controller/front_controller_generator.rb +7 -6
  12. data/lib/generators/hobo/i18n/templates/hobo.en.yml +2 -1
  13. data/lib/generators/hobo/i18n/templates/hobo.es.yml +1 -0
  14. data/lib/generators/hobo/i18n/templates/hobo.ru.yml +1 -0
  15. data/lib/generators/hobo/routes/router.rb +5 -3
  16. data/lib/generators/hobo/routes/templates/hobo_routes.rb.erb +0 -36
  17. data/lib/generators/hobo/setup_wizard/setup_wizard_generator.rb +2 -2
  18. data/lib/hobo.rb +2 -2
  19. data/lib/hobo/controller.rb +1 -1
  20. data/lib/hobo/controller/model.rb +4 -4
  21. data/lib/hobo/extensions/active_record/associations/association.rb +1 -1
  22. data/lib/hobo/extensions/active_record/associations/scope.rb +6 -5
  23. data/lib/hobo/extensions/active_record/relation_with_origin.rb +9 -7
  24. data/lib/hobo/model.rb +1 -2
  25. data/lib/hobo/model/accessible_associations.rb +4 -5
  26. data/lib/hobo/model/permissions.rb +7 -6
  27. data/lib/hobo/model/scopes.rb +1 -3
  28. data/lib/hobo/model/scopes/apply_scopes.rb +3 -3
  29. data/test/irt/generators/admin_subsite.irt +6 -0
  30. metadata +17 -39
  31. data/test/doctest/hobo/multi_model_forms.rdoctest +0 -260
  32. data/test/doctest/hobo/scopes.rdoctest +0 -375
@@ -24,7 +24,7 @@ module ActiveRecord
24
24
 
25
25
  private
26
26
 
27
- def raise_on_type_mismatch(record)
27
+ def raise_on_type_mismatch!(record)
28
28
  # Don't complain if the interface type of a polymorphic association doesn't exist
29
29
  klass = @reflection.klass rescue nil
30
30
  unless klass.nil? || record.is_a?(klass)
@@ -14,9 +14,10 @@ module ActiveRecord
14
14
  end
15
15
  end if false # DISABLED Getting Rails 3.1 working
16
16
 
17
- module SpawnMethods
17
+ class Relation
18
+ module DeprecatedMethods
18
19
 
19
- def apply_finder_options_with_scope(options)
20
+ def apply_finder_options_with_scope(options, silence_deprecation = false)
20
21
  scopes = []
21
22
  Array.wrap(options.delete(:scope)).each do |s|
22
23
  if s.is_a?(Hash)
@@ -25,11 +26,11 @@ module ActiveRecord
25
26
  scopes << [s]
26
27
  end
27
28
  end
28
- relation = apply_finder_options_without_scope(options)
29
+ relation = apply_finder_options_without_scope(options, silence_deprecation)
29
30
  return relation if scopes.empty?
30
31
  scopes.inject(relation) {|r, s| r.send *s }
31
32
  end
32
33
  alias_method_chain :apply_finder_options, :scope
33
-
34
- end
34
+ end if false # DISABLED Getting Rails 4.0 working
35
+ end
35
36
  end
@@ -24,13 +24,15 @@ module ActiveRecord
24
24
  module Associations
25
25
  class CollectionProxy
26
26
 
27
- def scoped_with_origin
28
- relation = scoped_without_origin.clone
29
- relation.origin = proxy_association.owner
30
- relation.origin_attribute = proxy_association.reflection.name
31
- relation
32
- end
33
- alias_method_chain :scoped, :origin
27
+ # FIXME Ralis4: really hoping that we can replace this with
28
+ # something based on https://github.com/rails/rails/issues/5717
29
+ # def scoped_with_origin
30
+ # relation = scoped_without_origin.clone
31
+ # relation.origin = proxy_association.owner
32
+ # relation.origin_attribute = proxy_association.reflection.name
33
+ # relation
34
+ # end
35
+ # alias_method_chain :scoped, :origin
34
36
 
35
37
  def method_missing_with_origin(method, *args, &block)
36
38
  res = method_missing_without_origin(method, *args, &block)
@@ -227,7 +227,6 @@ module Hobo
227
227
 
228
228
  def find_by_sql(*args)
229
229
  result = super
230
- result.member_class = self # find_by_sql always returns array
231
230
  result
232
231
  end
233
232
 
@@ -278,7 +277,7 @@ module Hobo
278
277
  r.klass >= self &&
279
278
  !r.options[:conditions] &&
280
279
  !r.options[:scope] &&
281
- r.foreign_key == refl.foreign_key
280
+ r.foreign_key.to_s == refl.foreign_key.to_s
282
281
  end
283
282
  end
284
283
  end
@@ -11,7 +11,7 @@ module Hobo
11
11
  array.map! do |record_hash_or_string|
12
12
  finder = association.member_class
13
13
  conditions = association.proxy_association.reflection.options[:conditions]
14
- finder = finder.scoped :conditions => conditions unless conditions == [[]] || conditions == [[],[]]
14
+ finder = finder.where(conditions) unless conditions == [[]] || conditions == [[],[]]
15
15
  find_or_create_and_update(owner, association_name, finder, record_hash_or_string) do |id|
16
16
  # The block is required to either locate find an existing record in the collection, or build a new one
17
17
  if id
@@ -91,7 +91,8 @@ module Hobo
91
91
 
92
92
  def finder_for_belongs_to(record, name)
93
93
  refl = record.class.reflections[name]
94
- conditions = ActiveRecord::Associations::BelongsToAssociation.new(record, refl).reflection.send(:conditions)
94
+ #conditions = ActiveRecord::Associations::BelongsToAssociation.new(record, refl).reflection.send(:conditions)
95
+ conditions = [[]]
95
96
  conditions == [[]] || conditions == [[],[]] ? refl.klass : refl.klass.scoped(:conditions => conditions)
96
97
  end
97
98
 
@@ -104,7 +105,6 @@ module Hobo
104
105
 
105
106
  def self.has_many_with_accessible(name, options={}, &block)
106
107
  has_many_without_accessible(name, options, &block)
107
-
108
108
  if options[:accessible]
109
109
  class_eval %{
110
110
  def #{name}_with_accessible=(array_or_hash)
@@ -163,8 +163,7 @@ module Hobo
163
163
 
164
164
 
165
165
  # Add :accessible to the valid options so AR doesn't complain
166
- ::ActiveRecord::Associations::Builder::BelongsTo.valid_options << :accessible
167
- ::ActiveRecord::Associations::Builder::HasMany.valid_options << :accessible
166
+ ::ActiveRecord::Associations::Builder::Association.valid_options << :accessible
168
167
 
169
168
  end
170
169
  end
@@ -7,8 +7,8 @@ module Hobo
7
7
  klass.class_eval do
8
8
  extend ClassMethods
9
9
 
10
- alias_method_chain :create, :hobo_permission_check
11
- alias_method_chain :update, :hobo_permission_check
10
+ alias_method_chain :create_record, :hobo_permission_check
11
+ alias_method_chain :update_record, :hobo_permission_check
12
12
  alias_method_chain :destroy, :hobo_permission_check
13
13
  class << self
14
14
  alias_method_chain :has_many, :hobo_permission_check
@@ -132,18 +132,18 @@ module Hobo
132
132
  acting_user && !(self.class.has_lifecycle? && lifecycle.active_step)
133
133
  end
134
134
 
135
- def create_with_hobo_permission_check(*args, &b)
135
+ def create_record_with_hobo_permission_check(*args, &b)
136
136
  if permission_check_required?
137
137
  create_permitted? or raise PermissionDeniedError, "#{self.class.name}#create"
138
138
  end
139
- create_without_hobo_permission_check(*args, &b)
139
+ create_record_without_hobo_permission_check(*args, &b)
140
140
  end
141
141
 
142
- def update_with_hobo_permission_check(*args)
142
+ def update_record_with_hobo_permission_check(*args)
143
143
  if permission_check_required?
144
144
  update_permitted? or raise PermissionDeniedError, "#{self.class.name}#update"
145
145
  end
146
- update_without_hobo_permission_check(*args)
146
+ update_record_without_hobo_permission_check(*args)
147
147
  end
148
148
 
149
149
  def destroy_with_hobo_permission_check
@@ -255,6 +255,7 @@ module Hobo
255
255
 
256
256
 
257
257
  def attribute_protected?(attribute)
258
+ return false if attribute.nil?
258
259
  attribute = attribute.to_s
259
260
 
260
261
  return true if self.class.send(:attributes_protected_by_default).include? attribute
@@ -2,9 +2,7 @@ module Hobo
2
2
  module Model
3
3
  module Scopes
4
4
 
5
- ::ActiveRecord::Associations::Builder::BelongsTo.valid_options << :scope
6
- ::ActiveRecord::Associations::Builder::HasMany.valid_options << :scope
7
- ::ActiveRecord::Associations::Builder::HasOne.valid_options << :scope
5
+ ::ActiveRecord::Associations::Builder::Association.valid_options << :scope
8
6
 
9
7
  def self.included_in_class(klass)
10
8
  klass.class_eval do
@@ -4,12 +4,12 @@ module Hobo
4
4
  module ApplyScopes
5
5
 
6
6
  def apply_scopes(scopes)
7
- result = scoped
7
+ result = self
8
8
  scopes.each_pair do |scope, arg|
9
9
  if arg.is_a?(Array)
10
- result = result.send(scope, *arg) unless arg.first.blank?
10
+ result = self.send(scope, *arg) unless arg.first.blank?
11
11
  else
12
- result = result.send(scope, arg) unless arg.blank?
12
+ result = self.send(scope, arg) unless arg.blank?
13
13
  end
14
14
  end
15
15
  result
@@ -3,3 +3,9 @@ invoke 'hobo:admin_subsite', %w[ -q ]
3
3
  desc "Admin Subsite files exist"
4
4
  files_exist? %w( app/controllers/admin/admin_site_controller.rb app/controllers/admin/users_controller.rb app/helpers/admin/users_helper.rb app/views/taglibs/admin_site.dryml )
5
5
  test_value_eql? true
6
+
7
+ desc "Admin::UsersController matches"
8
+ file_include? "app/controllers/admin/users_controller.rb",
9
+ 'class Admin::UsersController < Admin::AdminSiteController',
10
+ 'hobo_model_controller'
11
+ test_value_eql? true
metadata CHANGED
@@ -1,84 +1,74 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hobo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
5
- prerelease:
4
+ version: 2.1.0.pre1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tom Locke
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-23 00:00:00.000000000 Z
11
+ date: 2013-12-18 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: hobo_support
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - '='
20
18
  - !ruby/object:Gem::Version
21
- version: 2.0.1
19
+ version: 2.1.0.pre1
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - '='
28
25
  - !ruby/object:Gem::Version
29
- version: 2.0.1
26
+ version: 2.1.0.pre1
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: hobo_fields
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - '='
36
32
  - !ruby/object:Gem::Version
37
- version: 2.0.1
33
+ version: 2.1.0.pre1
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - '='
44
39
  - !ruby/object:Gem::Version
45
- version: 2.0.1
40
+ version: 2.1.0.pre1
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: dryml
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - '='
52
46
  - !ruby/object:Gem::Version
53
- version: 2.0.1
47
+ version: 2.1.0.pre1
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - '='
60
53
  - !ruby/object:Gem::Version
61
- version: 2.0.1
54
+ version: 2.1.0.pre1
62
55
  - !ruby/object:Gem::Dependency
63
- name: will_paginate
56
+ name: hobo_will_paginate
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
- version: 3.0.0
61
+ version: '0'
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
- version: 3.0.0
68
+ version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rubydoctest
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: shoulda
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - '>='
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - '>='
108
95
  - !ruby/object:Gem::Version
@@ -110,7 +97,6 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: irt
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - '='
116
102
  - !ruby/object:Gem::Version
@@ -118,7 +104,6 @@ dependencies:
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - '='
124
109
  - !ruby/object:Gem::Version
@@ -126,7 +111,6 @@ dependencies:
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: mocha
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
115
  - - '>='
132
116
  - !ruby/object:Gem::Version
@@ -134,7 +118,6 @@ dependencies:
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
122
  - - '>='
140
123
  - !ruby/object:Gem::Version
@@ -142,7 +125,6 @@ dependencies:
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: yard
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
129
  - - '>='
148
130
  - !ruby/object:Gem::Version
@@ -150,7 +132,6 @@ dependencies:
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
136
  - - '>='
156
137
  - !ruby/object:Gem::Version
@@ -166,6 +147,7 @@ files:
166
147
  - CHANGES-1.3.txt
167
148
  - CHANGES-1.4.txt
168
149
  - CHANGES-2.0.markdown
150
+ - CHANGES-2.1.markdown
169
151
  - Gemfile
170
152
  - LICENSE.txt
171
153
  - README
@@ -333,8 +315,6 @@ files:
333
315
  - test/doctest/hobo/hobo_helper.rdoctest
334
316
  - test/doctest/hobo/lifecycles.rdoctest
335
317
  - test/doctest/hobo/model.rdoctest
336
- - test/doctest/hobo/multi_model_forms.rdoctest
337
- - test/doctest/hobo/scopes.rdoctest
338
318
  - test/doctest/prepare_testapp.rb
339
319
  - test/irt/generators/admin_subsite.irt
340
320
  - test/irt/generators/assets.irt
@@ -367,28 +347,26 @@ files:
367
347
  - test/permissions/test_permissions.rb
368
348
  homepage: http://hobocentral.net
369
349
  licenses: []
350
+ metadata: {}
370
351
  post_install_message:
371
352
  rdoc_options:
372
353
  - --charset=UTF-8
373
354
  require_paths:
374
355
  - lib
375
356
  required_ruby_version: !ruby/object:Gem::Requirement
376
- none: false
377
357
  requirements:
378
358
  - - '>='
379
359
  - !ruby/object:Gem::Version
380
360
  version: '0'
381
361
  required_rubygems_version: !ruby/object:Gem::Requirement
382
- none: false
383
362
  requirements:
384
363
  - - '>='
385
364
  - !ruby/object:Gem::Version
386
365
  version: 1.3.6
387
366
  requirements: []
388
367
  rubyforge_project: hobo
389
- rubygems_version: 1.8.25
368
+ rubygems_version: 2.1.11
390
369
  signing_key:
391
- specification_version: 3
370
+ specification_version: 4
392
371
  summary: The web app builder for Rails
393
372
  test_files: []
394
- has_rdoc:
@@ -1,260 +0,0 @@
1
- Accessible Associations
2
- {.document-title}
3
-
4
- This chapter describes Hobo's support for nested models in forms.
5
- This is mostly technical background -- beginners should not have to
6
- read more than the introduction.
7
-
8
- Contents
9
- {.contents-heading}
10
-
11
- - contents
12
- {:toc}
13
-
14
- doctest: prepare testapp environment
15
- doctest_require: '../prepare_testapp'
16
-
17
- >> ActiveRecord::Base.logger = ActiveSupport::BufferedLogger.new(StringIO.new(''))
18
- >>
19
- def migrate(renames={})
20
- up, down = Generators::Hobo::Migration::Migrator.run(renames)
21
- ActiveRecord::Migration.class_eval(up)
22
- ActiveRecord::Base.send(:descendants).each { |model| model.reset_column_information }
23
- [up, down]
24
- end
25
- {.hidden}
26
-
27
- # Introduction
28
-
29
- Using multi-model forms in Hobo is very straightforward:
30
-
31
- class Blog < ActiveRecord::Base
32
- hobo_model
33
- has_many :posts, :accessible => true, :inverse_of => :blog
34
-
35
- class Post < ActiveRecord::Base
36
- hobo_model
37
- belongs_to :blog, :inverse_of => :posts
38
-
39
- The `:accessible` flag is a Hobo addition, the `:inverse_of` flag is
40
- standard Rails. `:inverse_of` is optional but highly recommended in
41
- Rails; Hobo requires it.
42
-
43
- Once you've done that, the default forms that Hobo builds will use the
44
- [input-many](/api_tag_defs/input-many) tag.
45
-
46
- `:accessible => true` works for `has_many`, `has_many :through` and
47
- `belongs_to`, but does not work for `has_one` or
48
- `has_and_belongs_to_many`.
49
-
50
- It's quite common to also add the `:dependent => :destroy` flag to
51
- accessible associations. This also used to trigger magic in Hobo, but
52
- this additional magic has been removed and replaced with [View
53
- Hints](/manual/viewhints). See the [Rails
54
- rdoc](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html)
55
- for more information on `:dependent => :destroy`.
56
-
57
- # Model Support
58
-
59
- We'll use rubydoctest to provide our examples for this section. Here
60
- are the models:
61
-
62
- >>
63
- class Foo < ActiveRecord::Base
64
- hobo_model
65
- fields { name :string }
66
- has_many :bars, :accessible => true
67
- attr_accessible :name, :bars
68
- end
69
- >>
70
- class Bar < ActiveRecord::Base
71
- hobo_model
72
- fields { name :string }
73
- belongs_to :foo
74
- attr_accessible :name, :foo, :foo_id
75
- end
76
- >> migrate
77
-
78
- The `:accessible => true` option patches in
79
- `Hobo::Model::AccessibleAssociations` to your ActiveRecord model. It
80
- modifies the `bars=` writer function to support assigning an array of
81
- records, an array of hashes, an array of ids, or an empty string.
82
-
83
- ## Assigning an array of records
84
-
85
- The whole array must be assigned -- any records that are not assigned
86
- are deleted from your association.
87
-
88
- >> bar1 = Bar.new(:name => "bar1")
89
- >> bar2 = Bar.new(:name => "bar2")
90
- >> foo = Foo.new(:name => "foo1")
91
- >> foo.bars = [bar1, bar2]
92
- >> foo.bars.*.name
93
- => ["bar1", "bar2"]
94
- >> foo.save!
95
-
96
- >> foo.bars = [bar2]
97
- >> foo.bars.*.name
98
- => ["bar2"]
99
- >> foo.save!
100
-
101
- >> bar2.foo.name
102
- => "foo1"
103
- >> bar1.reload
104
- >> bar1.foo
105
- => nil
106
-
107
- If `:dependent => :destroy` had been set on `has_many :bars`, bar1
108
- would now be deleted from the database. Since it hasn't, it still
109
- exists in the database but has become orphaned.
110
-
111
- ## Assigning an array of hashes
112
-
113
- Assigning an array of hashes maps nicely with how Rails deconstructs
114
- your URI encoded query string. For example, your form can return
115
-
116
- foo[bars][0][name]=bar1&foo[bars][0][name]=bar2
117
-
118
- which Rails will decode into your params hash as
119
-
120
- >> params = {"foo" => {"bars" => [ {"name" => "bar3"}, {"name" => "bar4"}]}}
121
-
122
- With Hobo's accessible associations, the params hash may be directly
123
- assigned.
124
-
125
- >> foo.attributes = params["foo"]
126
- >> foo.bars.*.name
127
- => ["bar3", "bar4"]
128
- >> foo.save!
129
-
130
- Because these parameters did not include an ID, Hobo created new bar
131
- models. If you include an ID, Hobo looks up the existing record in
132
- the database and modifies it with the parameters assigned.
133
-
134
- >> params = {"foo" => {"bars" => [ {:name => "bar3_mod", :id => "#{foo.bars[0].id}"}]}}
135
-
136
- >> old_bar3_id = foo.bars[0].id
137
- >> foo.attributes = params["foo"]
138
- >> foo.save!
139
- >> foo.bars.*.name
140
- => ["bar3_mod"]
141
- >> foo.bars[0].id == old_bar3_id
142
- => true
143
-
144
- ## Assigning an array of IDs
145
-
146
- While [input-many](/api_tag_defs/input-many) returns an array of
147
- hashes, [select-many](/api_tag_defs/select-many) returns an array of
148
- ids. These ids must have an "@" prepended.
149
-
150
- >> params = {"foo" => {"bars" => ["@#{bar1.id}", "@#{bar2.id}"]}}
151
- >> foo.attributes = params["foo"]
152
- >> foo.save!
153
- >> foo.bars.*.name
154
- => ["bar1", "bar2"]
155
-
156
- ## Assigning an empty string
157
-
158
- You can remove all elements from the association by assigning an empty
159
- array:
160
-
161
- >> foo.bars = []
162
- >> foo.bars
163
- => []
164
-
165
- However, there is no way to format a URI query string to make Rails
166
- construct an empty array in its params hash, so Hobo adds a useful
167
- shortcut to it's accessible associations:
168
-
169
- >> foo.bars = ""
170
- >> foo.bars
171
- => []
172
-
173
- # View Support
174
-
175
- The Rapid tags [input-many](/api_tag_defs/input-many),
176
- [input-all](/api_tag_defs/input-all),
177
- [select-many](/api_tag_defs/select-many) and
178
- [check-many](/api_tag_defs/check-many) all require accessible
179
- associations.
180
-
181
- `input-many` may even be used in a nested fashion:
182
-
183
- <form>
184
- <field-list:>
185
- <foos-view:>
186
- <input-many>
187
- <field-list:>
188
- <bars-view:>
189
- <input-many>
190
- </input-many>
191
- </bars-view:>
192
- </field-list:>
193
- </input-many>
194
- </foos-view:>
195
- </field-list:>
196
- </form>
197
-
198
- You do not need to use the accessible association tags -- standard
199
- inputs acquire the correct `name` for use with accessible associations
200
- when called from the appropriate context. Here's an example form that
201
- will work with the example given above in *Model Support*
202
-
203
- <form>
204
- <field-list:>
205
- <bars-view:>
206
- <repeat>
207
- <input:name/>
208
- </repeat>
209
- </bars-view:>
210
- <field-list:>
211
- </form>
212
-
213
- # Controller Support
214
-
215
- No special code is required in your controllers to support accessible
216
- associations, even if you aren't using a Hobo controller.
217
-
218
- # Validations
219
-
220
- Validations simply work as you'd expect. The only thing to note is
221
- that validation errors in a child object will cause the parent
222
- object to receive an error message of "..." on the association.
223
-
224
- # Transactions
225
-
226
- Hobo's accessible associations do not do any explicit saves so any new
227
- child objects are not saved until the parent object is saved. Rails
228
- wraps this save in a transaction, so any save is an all or nothing
229
- deal even though parents and children are saved via different SQL
230
- statements.
231
-
232
- # Rails 2.3 nested models
233
-
234
- Rails 2.3 includes a functionality similar to Hobo's accessible
235
- associations. The Hobo version is based on an early version of the
236
- Rails functionality, but unfortunately the Rails version changed
237
- significantly between the time that the Hobo version was released and
238
- when Rails 2.3 was released.
239
-
240
- For more information on Rails 2.3's `accept_nested_attributes_for`,
241
- see [the Ruby on Rails
242
- blog](http://weblog.rubyonrails.org/2009/1/26/nested-model-forms) or
243
- [Ryan Daigle's blog](http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes).
244
-
245
- The two versions use a different model: in Hobo the whole array is
246
- assigned, allowing add, delete or update via a single mechanism. In
247
- rails, there's a different mechanism for adding or deleting objects
248
- from the association, and there's no method for update.
249
-
250
- Each version have their pluses and minuses. The Hobo version is
251
- conceptually simpler, but it starts to get unwieldy if there are a
252
- large number of elements in the association.
253
-
254
- Both mechanisms are compatible and may be enabled simultaneously.
255
-
256
- It's certainly possible that later versions of Rapid will acquire tags
257
- that will require `accept_nested_attributes_for`. However, it's
258
- unlikely that Hobo will drop support for accessible associations
259
- unless ActiveRecord itself changes significantly.
260
-