active_scaffold 3.4.10 → 3.4.11
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 +4 -4
 - data/CHANGELOG +7 -0
 - data/README.md +1 -1
 - data/lib/active_scaffold/actions/create.rb +5 -1
 - data/lib/active_scaffold/attribute_params.rb +34 -1
 - data/lib/active_scaffold/data_structures/action_links.rb +1 -1
 - data/lib/active_scaffold/data_structures/nested_info.rb +8 -4
 - data/lib/active_scaffold/extensions/routing_mapper.rb +2 -1
 - data/lib/active_scaffold/finder.rb +1 -1
 - data/lib/active_scaffold/helpers/association_helpers.rb +9 -1
 - data/lib/active_scaffold/helpers/form_column_helpers.rb +1 -1
 - data/lib/active_scaffold/responds_to_parent.rb +0 -1
 - data/lib/active_scaffold/version.rb +1 -1
 - data/test/extensions/routing_mapper_test.rb +1 -0
 - data/test/misc/attribute_params_test.rb +62 -4
 - data/test/mock_app/app/models/building.rb +2 -11
 - data/test/mock_app/app/models/floor.rb +2 -2
 - data/test/mock_app/app/models/person.rb +2 -2
 - data/test/mock_app/config/environments/test.rb +1 -0
 - data/test/mock_app/db/schema.rb +1 -0
 - data/test/test_helper.rb +2 -4
 - metadata +4 -4
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: e19f95fd4ac370c29a8d8774e4b3c94083e6df2a
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 419230d149a695aebf92be0aa1d6c1455868ddac
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: d763e9f014fc3b43cfa5f81218d50a5f4f276d56f97522c1631c7771ad9ae6793318ee9b112dc691d73f80541b4a39ab73b8ba6e6f7413fcab4b15510c66c66b
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 77add87ef5f5ce6260296e9272fdae39de94407ff9071fdd3250f5f7219262660a2485889dc6f498ad043cf8da39a696d07095c69d662f56f694b30017f1675c
         
     | 
    
        data/CHANGELOG
    CHANGED
    
    | 
         @@ -1,3 +1,10 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            = 3.4.11
         
     | 
| 
      
 2 
     | 
    
         
            +
            - Fix refresh-link on main form (not subform)
         
     | 
| 
      
 3 
     | 
    
         
            +
            - Workaround for counter_cache bug on rails4 (https://github.com/rails/rails/pull/14849)
         
     | 
| 
      
 4 
     | 
    
         
            +
            - Support create form on nested scaffolds on through association, if through reflection association is included in create form
         
     | 
| 
      
 5 
     | 
    
         
            +
            - Remove ruby 1.8 support
         
     | 
| 
      
 6 
     | 
    
         
            +
            - Fix :index member route (list one item), broken on 3.4.9
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
       1 
8 
     | 
    
         
             
            = 3.4.10
         
     | 
| 
       2 
9 
     | 
    
         
             
            - singular associations on subform are always created, in other case it's not possible to enable a checkbox without filling text fields.
         
     | 
| 
       3 
10 
     | 
    
         
             
            - process_action_link_action checks security for crud_type and action now
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -2,7 +2,7 @@ Overview 
     | 
|
| 
       2 
2 
     | 
    
         
             
            ========
         
     | 
| 
       3 
3 
     | 
    
         
             
            [](https://travis-ci.org/activescaffold/active_scaffold)
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
            ActiveScaffold provides a quick and powerful user interfaces for CRUD (create, read, update, delete) operations for Rails applications. It offers additonal features including searching, pagination & layout control.  Rails 3.2 and 4.x are supported. For rails 4 is recommended >= 4.0.5.
         
     | 
| 
      
 5 
     | 
    
         
            +
            ActiveScaffold provides a quick and powerful user interfaces for CRUD (create, read, update, delete) operations for Rails applications. It offers additonal features including searching, pagination & layout control.  Rails 3.2 and 4.x are supported, ruby >= 1.9 required. For rails 4 is recommended >= 4.0.5.
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            Branch Details
         
     | 
| 
       8 
8 
     | 
    
         
             
            --------------
         
     | 
| 
         @@ -133,7 +133,11 @@ module ActiveScaffold::Actions 
     | 
|
| 
       133 
133 
     | 
    
         
             
                end
         
     | 
| 
       134 
134 
     | 
    
         | 
| 
       135 
135 
     | 
    
         
             
                def create_authorized?
         
     | 
| 
       136 
     | 
    
         
            -
                   
     | 
| 
      
 136 
     | 
    
         
            +
                  if nested?
         
     | 
| 
      
 137 
     | 
    
         
            +
                    nested_authorized = !nested.readonly? && !nested.readonly_through_association?(active_scaffold_config.create.columns)
         
     | 
| 
      
 138 
     | 
    
         
            +
                    return false unless nested_authorized
         
     | 
| 
      
 139 
     | 
    
         
            +
                  end
         
     | 
| 
      
 140 
     | 
    
         
            +
                  authorized_for?(:crud_type => :create)
         
     | 
| 
       137 
141 
     | 
    
         
             
                end
         
     | 
| 
       138 
142 
     | 
    
         
             
                private
         
     | 
| 
       139 
143 
     | 
    
         
             
                def create_authorized_filter
         
     | 
| 
         @@ -32,6 +32,36 @@ module ActiveScaffold 
     | 
|
| 
       32 
32 
     | 
    
         
             
              # }
         
     | 
| 
       33 
33 
     | 
    
         
             
              module AttributeParams
         
     | 
| 
       34 
34 
     | 
    
         
             
                protected
         
     | 
| 
      
 35 
     | 
    
         
            +
                # workaround to update counters when belongs_to changes on persisted record on Rails 3
         
     | 
| 
      
 36 
     | 
    
         
            +
                # TODO remove when rails3 support is removed
         
     | 
| 
      
 37 
     | 
    
         
            +
                def rails3_counter_cache_hack(parent_record, column, value)
         
     | 
| 
      
 38 
     | 
    
         
            +
                  association = parent_record.association(column.name)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  if association.send(:has_cached_counter?)
         
     | 
| 
      
 40 
     | 
    
         
            +
                    counter_attr = association.send(:cached_counter_attribute_name)
         
     | 
| 
      
 41 
     | 
    
         
            +
                    difference = value.select(&:persisted?).size - parent_record.send(counter_attr)
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                    if parent_record.new_record?
         
     | 
| 
      
 44 
     | 
    
         
            +
                      parent_record.send "#{counter_attr}=", difference
         
     | 
| 
      
 45 
     | 
    
         
            +
                    else
         
     | 
| 
      
 46 
     | 
    
         
            +
                      # don't decrement counter for deleted records, on destroy they will update counter
         
     | 
| 
      
 47 
     | 
    
         
            +
                      difference += (parent_record.send(column.name) - value).size
         
     | 
| 
      
 48 
     | 
    
         
            +
                      association.send :update_counter, difference unless difference == 0
         
     | 
| 
      
 49 
     | 
    
         
            +
                    end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                    # update counters on old parents if belongs_to is changed
         
     | 
| 
      
 52 
     | 
    
         
            +
                    value.select(&:persisted?).each do |record|
         
     | 
| 
      
 53 
     | 
    
         
            +
                      key = record.send(column.association.foreign_key)
         
     | 
| 
      
 54 
     | 
    
         
            +
                      parent_record.class.decrement_counter counter_attr, key if key != parent_record.id
         
     | 
| 
      
 55 
     | 
    
         
            +
                    end
         
     | 
| 
      
 56 
     | 
    
         
            +
                  end
         
     | 
| 
      
 57 
     | 
    
         
            +
                end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                # workaround for updating counters twice bug on rails4 (https://github.com/rails/rails/pull/14849)
         
     | 
| 
      
 60 
     | 
    
         
            +
                # TODO remove when pull request is merged and no version with bug is supported
         
     | 
| 
      
 61 
     | 
    
         
            +
                def counter_cache_hack?(column, value)
         
     | 
| 
      
 62 
     | 
    
         
            +
                  Rails.version >= '4.0' && column.association.try(:belongs_to?) && column.association.options[:counter_cache] && !value.is_a?(Hash)
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
       35 
65 
     | 
    
         
             
                # Takes attributes (as from params[:record]) and applies them to the parent_record. Also looks for
         
     | 
| 
       36 
66 
     | 
    
         
             
                # association attributes and attempts to instantiate them as associated objects.
         
     | 
| 
       37 
67 
     | 
    
         
             
                #
         
     | 
| 
         @@ -62,8 +92,12 @@ module ActiveScaffold 
     | 
|
| 
       62 
92 
     | 
    
         
             
                        value = column_value_from_param_value(parent_record, column, attributes[column.name], avoid_changes)
         
     | 
| 
       63 
93 
     | 
    
         
             
                        if avoid_changes && column.plural_association?
         
     | 
| 
       64 
94 
     | 
    
         
             
                          parent_record.association(column.name).target = value
         
     | 
| 
      
 95 
     | 
    
         
            +
                        elsif counter_cache_hack?(column, attributes[column.name])
         
     | 
| 
      
 96 
     | 
    
         
            +
                          parent_record.send "#{column.association.foreign_key}=", value.try(:id)
         
     | 
| 
      
 97 
     | 
    
         
            +
                          parent_record.association(column.name).target = value
         
     | 
| 
       65 
98 
     | 
    
         
             
                        else
         
     | 
| 
       66 
99 
     | 
    
         
             
                          begin
         
     | 
| 
      
 100 
     | 
    
         
            +
                            rails3_counter_cache_hack(parent_record, column, value) if Rails.version < '4.0' && column.plural_association?
         
     | 
| 
       67 
101 
     | 
    
         
             
                            parent_record.send "#{column.name}=", value
         
     | 
| 
       68 
102 
     | 
    
         
             
                          rescue ActiveRecord::RecordNotSaved
         
     | 
| 
       69 
103 
     | 
    
         
             
                            parent_record.errors.add column.name, :invalid
         
     | 
| 
         @@ -150,7 +184,6 @@ module ActiveScaffold 
     | 
|
| 
       150 
184 
     | 
    
         
             
                  if column.singular_association?
         
     | 
| 
       151 
185 
     | 
    
         
             
                    manage_nested_record_from_params(parent_record, column, value, avoid_changes)
         
     | 
| 
       152 
186 
     | 
    
         
             
                  elsif column.plural_association?
         
     | 
| 
       153 
     | 
    
         
            -
                    value = value.sort if RUBY_VERSION < '1.9'
         
     | 
| 
       154 
187 
     | 
    
         
             
                    # HACK to be able to delete all associated records, hash will include "0" => ""
         
     | 
| 
       155 
188 
     | 
    
         
             
                    value.collect {|key, value| manage_nested_record_from_params(parent_record, column, value, avoid_changes) unless value == ""}.compact
         
     | 
| 
       156 
189 
     | 
    
         
             
                  else
         
     | 
| 
         @@ -14,7 +14,7 @@ module ActiveScaffold::DataStructures 
     | 
|
| 
       14 
14 
     | 
    
         
             
                  link = if action.is_a?(ActiveScaffold::DataStructures::ActionLink) || action.is_a?(ActiveScaffold::DataStructures::ActionLinks)
         
     | 
| 
       15 
15 
     | 
    
         
             
                    action
         
     | 
| 
       16 
16 
     | 
    
         
             
                  else
         
     | 
| 
       17 
     | 
    
         
            -
                    options[:type] ||= default_type
         
     | 
| 
      
 17 
     | 
    
         
            +
                    options[:type] ||= default_type if default_type
         
     | 
| 
       18 
18 
     | 
    
         
             
                    ActiveScaffold::DataStructures::ActionLink.new(action, options)
         
     | 
| 
       19 
19 
     | 
    
         
             
                  end
         
     | 
| 
       20 
20 
     | 
    
         
             
                  # NOTE: this duplicate check should be done by defining the comparison operator for an Action data structure
         
     | 
| 
         @@ -54,7 +54,7 @@ module ActiveScaffold::DataStructures 
     | 
|
| 
       54 
54 
     | 
    
         
             
                  has_many? || habtm?
         
     | 
| 
       55 
55 
     | 
    
         
             
                end
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
                def readonly_through_association?
         
     | 
| 
      
 57 
     | 
    
         
            +
                def readonly_through_association?(columns)
         
     | 
| 
       58 
58 
     | 
    
         
             
                  false
         
     | 
| 
       59 
59 
     | 
    
         
             
                end
         
     | 
| 
       60 
60 
     | 
    
         | 
| 
         @@ -101,9 +101,13 @@ module ActiveScaffold::DataStructures 
     | 
|
| 
       101 
101 
     | 
    
         
             
                end
         
     | 
| 
       102 
102 
     | 
    
         | 
| 
       103 
103 
     | 
    
         
             
                # A through association with has_one or has_many as source association
         
     | 
| 
       104 
     | 
    
         
            -
                # create cannot be called in such through association
         
     | 
| 
       105 
     | 
    
         
            -
                 
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
      
 104 
     | 
    
         
            +
                # create cannot be called in such through association, unless create columns include through reflection of reverse association
         
     | 
| 
      
 105 
     | 
    
         
            +
                # e.g. customer -> networks -> firewall, reverse is firewall -> network -> customer,
         
     | 
| 
      
 106 
     | 
    
         
            +
                # firewall can be created if create columns include network
         
     | 
| 
      
 107 
     | 
    
         
            +
                def readonly_through_association?(columns)
         
     | 
| 
      
 108 
     | 
    
         
            +
                  through_association? && association.source_reflection.macro != :belongs_to && (
         
     | 
| 
      
 109 
     | 
    
         
            +
                    !child_association || !columns.include?(child_association.through_reflection.name)
         
     | 
| 
      
 110 
     | 
    
         
            +
                  )
         
     | 
| 
       107 
111 
     | 
    
         
             
                end
         
     | 
| 
       108 
112 
     | 
    
         | 
| 
       109 
113 
     | 
    
         
             
                def through_association?
         
     | 
| 
         @@ -23,6 +23,7 @@ module ActionDispatch 
     | 
|
| 
       23 
23 
     | 
    
         
             
                    end
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                    def as_routes(opts = {:association => true})
         
     | 
| 
      
 26 
     | 
    
         
            +
                      resource = parent_resource
         
     | 
| 
       26 
27 
     | 
    
         
             
                      resource_scope(:resource, ActiveScaffold.new(parent_resource.name, parent_resource.options)) do
         
     | 
| 
       27 
28 
     | 
    
         
             
                        collection do
         
     | 
| 
       28 
29 
     | 
    
         
             
                          ActionDispatch::Routing::ACTIVE_SCAFFOLD_CORE_ROUTING[:collection].each do |name, type|
         
     | 
| 
         @@ -33,7 +34,7 @@ module ActionDispatch 
     | 
|
| 
       33 
34 
     | 
    
         
             
                          ActionDispatch::Routing::ACTIVE_SCAFFOLD_CORE_ROUTING[:member].each do |name, type|
         
     | 
| 
       34 
35 
     | 
    
         
             
                            match(name, :via => type) if parent_resource.actions.include? name
         
     | 
| 
       35 
36 
     | 
    
         
             
                          end
         
     | 
| 
       36 
     | 
    
         
            -
                          get 'list', :action => :index if  
     | 
| 
      
 37 
     | 
    
         
            +
                          get 'list', :action => :index if resource.actions.include? :index
         
     | 
| 
       37 
38 
     | 
    
         
             
                        end
         
     | 
| 
       38 
39 
     | 
    
         
             
                      end
         
     | 
| 
       39 
40 
     | 
    
         
             
                      as_association_routes if opts[:association]
         
     | 
| 
         @@ -376,7 +376,7 @@ module ActiveScaffold 
     | 
|
| 
       376 
376 
     | 
    
         | 
| 
       377 
377 
     | 
    
         
             
                  # Converts count to an integer if ActiveRecord returned an OrderedHash
         
     | 
| 
       378 
378 
     | 
    
         
             
                  # that happens when find_options contains a :group key
         
     | 
| 
       379 
     | 
    
         
            -
                  count = count.length if count.is_a?(Hash) 
     | 
| 
      
 379 
     | 
    
         
            +
                  count = count.length if count.is_a?(Hash)
         
     | 
| 
       380 
380 
     | 
    
         
             
                  count
         
     | 
| 
       381 
381 
     | 
    
         
             
                end
         
     | 
| 
       382 
382 
     | 
    
         | 
| 
         @@ -59,7 +59,15 @@ module ActiveScaffold 
     | 
|
| 
       59 
59 
     | 
    
         
             
                  end
         
     | 
| 
       60 
60 
     | 
    
         | 
| 
       61 
61 
     | 
    
         
             
                  def association_klass_scoped(association, klass, record)
         
     | 
| 
       62 
     | 
    
         
            -
                     
     | 
| 
      
 62 
     | 
    
         
            +
                    if nested? && nested.through_association? && nested.child_association.try(:through_reflection) == association
         
     | 
| 
      
 63 
     | 
    
         
            +
                      if nested.association.through_reflection.collection?
         
     | 
| 
      
 64 
     | 
    
         
            +
                        nested_parent_record.send(nested.association.through_reflection.name)
         
     | 
| 
      
 65 
     | 
    
         
            +
                      else
         
     | 
| 
      
 66 
     | 
    
         
            +
                        klass.where(association.association_primary_key => nested_parent_record.send(nested.association.through_reflection.name).try(:id))
         
     | 
| 
      
 67 
     | 
    
         
            +
                      end
         
     | 
| 
      
 68 
     | 
    
         
            +
                    else
         
     | 
| 
      
 69 
     | 
    
         
            +
                      klass
         
     | 
| 
      
 70 
     | 
    
         
            +
                    end
         
     | 
| 
       63 
71 
     | 
    
         
             
                  end
         
     | 
| 
       64 
72 
     | 
    
         | 
| 
       65 
73 
     | 
    
         
             
                  # Sorts the options for select
         
     | 
| 
         @@ -277,7 +277,7 @@ module ActiveScaffold 
     | 
|
| 
       277 
277 
     | 
    
         
             
                      link_options['data-update_send_form_selector'] = html_options['data-update_send_form_selector']
         
     | 
| 
       278 
278 
     | 
    
         
             
                    else
         
     | 
| 
       279 
279 
     | 
    
         
             
                      scope = html_options[:name].scan(/^record((\[[^\]]*\])*)\[#{column.name}\]/)[0].try(:first) if html_options[:name]
         
     | 
| 
       280 
     | 
    
         
            -
                      link_options = update_columns_options(column, scope, link_options, true)
         
     | 
| 
      
 280 
     | 
    
         
            +
                      link_options = update_columns_options(column, scope.presence, link_options, true)
         
     | 
| 
       281 
281 
     | 
    
         
             
                    end
         
     | 
| 
       282 
282 
     | 
    
         
             
                    link_options[:class] = 'refresh-link'
         
     | 
| 
       283 
283 
     | 
    
         
             
                    link_to(as_(:refresh), link_options.delete('data-update_url') || html_options['data-update_url'], link_options)
         
     | 
| 
         @@ -10,7 +10,6 @@ module ActiveScaffold 
     | 
|
| 
       10 
10 
     | 
    
         
             
                  if performed?
         
     | 
| 
       11 
11 
     | 
    
         
             
                    # Either pull out a redirect or the request body
         
     | 
| 
       12 
12 
     | 
    
         
             
                    script =  if response.headers['Location']
         
     | 
| 
       13 
     | 
    
         
            -
                                #TODO: erase_redirect_results is missing in rails 3.0
         
     | 
| 
       14 
13 
     | 
    
         
             
                                "document.location.href = '#{self.class.helpers.escape_javascript location.to_s}'"
         
     | 
| 
       15 
14 
     | 
    
         
             
                              else
         
     | 
| 
       16 
15 
     | 
    
         
             
                                response.body || ''
         
     | 
| 
         @@ -4,6 +4,7 @@ class RoutingMapperTest < ActionController::TestCase 
     | 
|
| 
       4 
4 
     | 
    
         
             
              test 'rails routes' do
         
     | 
| 
       5 
5 
     | 
    
         
             
                assert_routing 'addresses', :controller => 'addresses', :action => 'index'
         
     | 
| 
       6 
6 
     | 
    
         
             
                assert_routing 'addresses/1', :controller => 'addresses', :action => 'show', :id => '1'
         
     | 
| 
      
 7 
     | 
    
         
            +
                assert_routing 'addresses/1/list', :controller => 'addresses', :action => 'index', :id => '1'
         
     | 
| 
       7 
8 
     | 
    
         
             
                assert_routing 'addresses/1/edit', :controller => 'addresses', :action => 'edit', :id => '1'
         
     | 
| 
       8 
9 
     | 
    
         
             
                assert_routing({:method => :put, :path => 'addresses/1'}, {:controller => 'addresses', :action => 'update', :id => '1'})
         
     | 
| 
       9 
10 
     | 
    
         
             
                assert_routing({:method => :delete, :path => 'addresses/1'}, {:controller => 'addresses', :action => 'destroy', :id => '1'})
         
     | 
| 
         @@ -13,7 +13,6 @@ class AttributeParamsTest < MiniTest::Test 
     | 
|
| 
       13 
13 
     | 
    
         
             
                assert model.save
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                model.buildings.create(:name => '1st building')
         
     | 
| 
       16 
     | 
    
         
            -
                model.reload
         
     | 
| 
       17 
16 
     | 
    
         
             
                model = update_record_from_params(model, :update, :first_name, :last_name, :first_name => 'Name', :last_name => 'Last')
         
     | 
| 
       18 
17 
     | 
    
         
             
                assert_equal 'Name', model.first_name
         
     | 
| 
       19 
18 
     | 
    
         
             
                assert_equal 'Last', model.last_name
         
     | 
| 
         @@ -69,7 +68,7 @@ class AttributeParamsTest < MiniTest::Test 
     | 
|
| 
       69 
68 
     | 
    
         
             
                assert_equal 0, model.reload.buildings_count
         
     | 
| 
       70 
69 
     | 
    
         
             
              end
         
     | 
| 
       71 
70 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
              def  
     | 
| 
      
 71 
     | 
    
         
            +
              def test_saving_belongs_to_select_for_has_one_reverse
         
     | 
| 
       73 
72 
     | 
    
         
             
                person = Person.create
         
     | 
| 
       74 
73 
     | 
    
         
             
                assert person.persisted?
         
     | 
| 
       75 
74 
     | 
    
         
             
                assert_equal 0, person.floors_count
         
     | 
| 
         @@ -87,8 +86,44 @@ class AttributeParamsTest < MiniTest::Test 
     | 
|
| 
       87 
86 
     | 
    
         
             
                assert_nil model.tenant, 'tenant should be cleared'
         
     | 
| 
       88 
87 
     | 
    
         
             
                assert_equal person.id, Floor.find(model.id).tenant_id, 'floor should not be saved yet'
         
     | 
| 
       89 
88 
     | 
    
         
             
                assert model.save
         
     | 
| 
       90 
     | 
    
         
            -
                assert_nil Floor.find(model.id).tenant_id, 'floor should  
     | 
| 
      
 89 
     | 
    
         
            +
                assert_nil Floor.find(model.id).tenant_id, 'floor should be saved'
         
     | 
| 
       91 
90 
     | 
    
         
             
                assert_equal 0, person.reload.floors_count
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                model = update_record_from_params(model, :create, :number, :tenant, :number => '1', :tenant => person.id.to_s)
         
     | 
| 
      
 93 
     | 
    
         
            +
                assert_equal 1, model.number
         
     | 
| 
      
 94 
     | 
    
         
            +
                assert_equal person.id, model.tenant_id
         
     | 
| 
      
 95 
     | 
    
         
            +
                assert_equal person, model.tenant
         
     | 
| 
      
 96 
     | 
    
         
            +
                assert model.save
         
     | 
| 
      
 97 
     | 
    
         
            +
                assert_equal 1, person.reload.floors_count
         
     | 
| 
      
 98 
     | 
    
         
            +
              end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
              def test_saving_belongs_to_select_for_has_many_reverse
         
     | 
| 
      
 101 
     | 
    
         
            +
                person = Person.create
         
     | 
| 
      
 102 
     | 
    
         
            +
                assert person.persisted?
         
     | 
| 
      
 103 
     | 
    
         
            +
                assert_equal 0, person.buildings_count
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                model = update_record_from_params(Building.new, :create, :name, :owner, :name => 'Tower', :owner => person.id.to_s)
         
     | 
| 
      
 106 
     | 
    
         
            +
                assert_equal 'Tower', model.name
         
     | 
| 
      
 107 
     | 
    
         
            +
                assert_equal person.id, model.owner_id
         
     | 
| 
      
 108 
     | 
    
         
            +
                assert_equal person, model.owner
         
     | 
| 
      
 109 
     | 
    
         
            +
                assert model.save
         
     | 
| 
      
 110 
     | 
    
         
            +
                assert_equal 1, person.reload.buildings_count
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
                model = update_record_from_params(model, :update, :name, :owner, :name => 'Tower', :owner => '')
         
     | 
| 
      
 113 
     | 
    
         
            +
                assert_equal 'Tower', model.name
         
     | 
| 
      
 114 
     | 
    
         
            +
                assert_nil model.owner_id, 'owner should be cleared'
         
     | 
| 
      
 115 
     | 
    
         
            +
                assert_nil model.owner, 'owner should be cleared'
         
     | 
| 
      
 116 
     | 
    
         
            +
                assert_equal person.id, Building.find(model.id).owner_id, 'building should not be saved yet'
         
     | 
| 
      
 117 
     | 
    
         
            +
                assert model.save
         
     | 
| 
      
 118 
     | 
    
         
            +
                assert_nil Building.find(model.id).owner_id, 'building should be saved'
         
     | 
| 
      
 119 
     | 
    
         
            +
                assert_equal 0, person.reload.buildings_count
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
                model = update_record_from_params(model, :create, :name, :owner, :name => 'Tower', :owner => person.id.to_s)
         
     | 
| 
      
 122 
     | 
    
         
            +
                assert_equal 'Tower', model.name
         
     | 
| 
      
 123 
     | 
    
         
            +
                assert_equal person.id, model.owner_id
         
     | 
| 
      
 124 
     | 
    
         
            +
                assert_equal person, model.owner
         
     | 
| 
      
 125 
     | 
    
         
            +
                assert model.save
         
     | 
| 
      
 126 
     | 
    
         
            +
                assert_equal 1, person.reload.buildings_count
         
     | 
| 
       92 
127 
     | 
    
         
             
              end
         
     | 
| 
       93 
128 
     | 
    
         | 
| 
       94 
129 
     | 
    
         
             
              def test_saving_has_one_select
         
     | 
| 
         @@ -183,7 +218,7 @@ class AttributeParamsTest < MiniTest::Test 
     | 
|
| 
       183 
218 
     | 
    
         
             
                floor = Floor.create
         
     | 
| 
       184 
219 
     | 
    
         
             
                people = 2.times.map { Person.create }
         
     | 
| 
       185 
220 
     | 
    
         
             
                key = Time.now.to_i.to_s
         
     | 
| 
       186 
     | 
    
         
            -
                floors = {'0' => '',  
     | 
| 
      
 221 
     | 
    
         
            +
                floors = {'0' => '', floor.id.to_s => {:number => '1', :tenant => '', :id => floor.id.to_s}, key => {:number => '2', 'tenant' => people.first.id.to_s}, key.succ => {:number => '4', 'tenant' => people.last.id.to_s}}
         
     | 
| 
       187 
222 
     | 
    
         
             
                model = update_record_from_params(Building.new, :create, :name, :floors, :name => 'First', :floors => floors)
         
     | 
| 
       188 
223 
     | 
    
         
             
                assert_equal 'First', model.name
         
     | 
| 
       189 
224 
     | 
    
         
             
                assert_equal 3, model.floors.size
         
     | 
| 
         @@ -191,11 +226,33 @@ class AttributeParamsTest < MiniTest::Test 
     | 
|
| 
       191 
226 
     | 
    
         
             
                assert_equal [nil, *people.map(&:id)], model.floors.map(&:tenant_id)
         
     | 
| 
       192 
227 
     | 
    
         
             
                assert model.save
         
     | 
| 
       193 
228 
     | 
    
         
             
                assert_equal [1, 1], people.map(&:reload).map(&:floors_count)
         
     | 
| 
      
 229 
     | 
    
         
            +
                assert_equal 3, model.reload.floors_count
         
     | 
| 
      
 230 
     | 
    
         
            +
             
     | 
| 
      
 231 
     | 
    
         
            +
                last_floor = model.floors.last
         
     | 
| 
      
 232 
     | 
    
         
            +
                floors = {'0' => '', floor.id.to_s => {:number => '1', :tenant => '', :id => floor.id.to_s}, last_floor.id.to_s => {:number => '4', 'tenant' => people.last.id.to_s, :id => last_floor.id.to_s}}
         
     | 
| 
      
 233 
     | 
    
         
            +
                model = update_record_from_params(model, :create, :name, :floors, :name => 'First', :floors => floors)
         
     | 
| 
      
 234 
     | 
    
         
            +
                assert_equal 'First', model.name
         
     | 
| 
      
 235 
     | 
    
         
            +
                assert_equal 2, model.floors.size
         
     | 
| 
      
 236 
     | 
    
         
            +
                assert_equal floor.id, model.floors.first.id
         
     | 
| 
      
 237 
     | 
    
         
            +
                assert_equal [nil, last_floor.tenant_id], model.floors.map(&:tenant_id)
         
     | 
| 
      
 238 
     | 
    
         
            +
                assert model.save
         
     | 
| 
      
 239 
     | 
    
         
            +
                assert_equal 2, model.reload.floors_count
         
     | 
| 
      
 240 
     | 
    
         
            +
             
     | 
| 
      
 241 
     | 
    
         
            +
                floors = {'0' => '', floor.id.to_s => {:number => '1', :tenant => '', :id => floor.id.to_s}}
         
     | 
| 
      
 242 
     | 
    
         
            +
                new_model = update_record_from_params(Building.create, :create, :name, :floors, :name => 'Last', :floors => floors)
         
     | 
| 
      
 243 
     | 
    
         
            +
                assert_equal 'Last', new_model.name
         
     | 
| 
      
 244 
     | 
    
         
            +
                assert_equal 1, new_model.floors.size
         
     | 
| 
      
 245 
     | 
    
         
            +
                assert_equal floor.id, new_model.floors.first.id
         
     | 
| 
      
 246 
     | 
    
         
            +
                assert_equal [nil], new_model.floors.map(&:tenant_id)
         
     | 
| 
      
 247 
     | 
    
         
            +
                assert new_model.save
         
     | 
| 
      
 248 
     | 
    
         
            +
                assert_equal 1, new_model.reload.floors_count
         
     | 
| 
      
 249 
     | 
    
         
            +
                assert_equal 1, model.reload.floors_count
         
     | 
| 
       194 
250 
     | 
    
         | 
| 
       195 
251 
     | 
    
         
             
                model = update_record_from_params(model, :update, :name, :floors, :name => 'Tower', :floors => {'0' => ''})
         
     | 
| 
       196 
252 
     | 
    
         
             
                assert_equal 'Tower', model.name
         
     | 
| 
       197 
253 
     | 
    
         
             
                assert model.floors.blank?, 'floors should be cleared'
         
     | 
| 
       198 
254 
     | 
    
         
             
                assert model.save
         
     | 
| 
      
 255 
     | 
    
         
            +
                assert_equal 0, model.reload.floors_count
         
     | 
| 
       199 
256 
     | 
    
         
             
              end
         
     | 
| 
       200 
257 
     | 
    
         | 
| 
       201 
258 
     | 
    
         
             
              def test_saving_belongs_to_crud
         
     | 
| 
         @@ -292,6 +349,7 @@ class AttributeParamsTest < MiniTest::Test 
     | 
|
| 
       292 
349 
     | 
    
         
             
                params = columns.extract_options!.with_indifferent_access
         
     | 
| 
       293 
350 
     | 
    
         
             
                new_record = nil
         
     | 
| 
       294 
351 
     | 
    
         
             
                record.class.transaction do
         
     | 
| 
      
 352 
     | 
    
         
            +
                  record = record.class.find(record.id) if record.persisted?
         
     | 
| 
       295 
353 
     | 
    
         
             
                  new_record = @controller.update_record_from_params(record, build_action_columns(record, action, columns), params)
         
     | 
| 
       296 
354 
     | 
    
         
             
                  MODELS.each { |model| model.any_instance.unstub(:save) }
         
     | 
| 
       297 
355 
     | 
    
         
             
                  yield if block_given?
         
     | 
| 
         @@ -1,17 +1,8 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            class Building < ActiveRecord::Base
         
     | 
| 
       2 
     | 
    
         
            -
              belongs_to :owner, :class_name => 'Person', :counter_cache => true
         
     | 
| 
       3 
     | 
    
         
            -
              has_many :floors, :dependent => : 
     | 
| 
      
 2 
     | 
    
         
            +
              belongs_to :owner, :class_name => 'Person', :counter_cache => true, :inverse_of => :building
         
     | 
| 
      
 3 
     | 
    
         
            +
              has_many :floors, :dependent => :destroy, :inverse_of => :building
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              has_one :address, :as => :addressable
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
              has_many :tenants, :through => :floors, :class_name => 'Person'
         
     | 
| 
       8 
     | 
    
         
            -
              
         
     | 
| 
       9 
     | 
    
         
            -
              if Rails.version < '4.1'
         
     | 
| 
       10 
     | 
    
         
            -
                after_update :update_buildings_count, :if => :owner_id_changed?
         
     | 
| 
       11 
     | 
    
         
            -
                
         
     | 
| 
       12 
     | 
    
         
            -
                def update_buildings_count
         
     | 
| 
       13 
     | 
    
         
            -
                  Person.decrement_counter(:buildings_count, owner_id_was) if owner_id_was
         
     | 
| 
       14 
     | 
    
         
            -
                  Person.increment_counter(:buildings_count, owner_id) if owner_id
         
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
              end
         
     | 
| 
       17 
8 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            class Floor < ActiveRecord::Base
         
     | 
| 
       2 
     | 
    
         
            -
              belongs_to :building
         
     | 
| 
       3 
     | 
    
         
            -
              belongs_to :tenant, :class_name => 'Person', :counter_cache => true
         
     | 
| 
      
 2 
     | 
    
         
            +
              belongs_to :building, :counter_cache => true, :inverse_of => :floors
         
     | 
| 
      
 3 
     | 
    
         
            +
              belongs_to :tenant, :class_name => 'Person', :counter_cache => true, :inverse_of => :floor
         
     | 
| 
       4 
4 
     | 
    
         
             
              has_one :address, :through => :building
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
              attr_accessor :number_required
         
     | 
| 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            class Person < ActiveRecord::Base
         
     | 
| 
       2 
     | 
    
         
            -
              has_many :buildings, :foreign_key => :owner_id
         
     | 
| 
       3 
     | 
    
         
            -
              has_one :floor, :foreign_key => :tenant_id
         
     | 
| 
      
 2 
     | 
    
         
            +
              has_many :buildings, :foreign_key => :owner_id, :inverse_of => :owner
         
     | 
| 
      
 3 
     | 
    
         
            +
              has_one :floor, :foreign_key => :tenant_id, :inverse_of => :tenant
         
     | 
| 
       4 
4 
     | 
    
         
             
              has_one :address, :through => :floor
         
     | 
| 
       5 
5 
     | 
    
         
             
              has_one :home, :through => :floor, :source => :building, :class_name => 'Building'
         
     | 
| 
       6 
6 
     | 
    
         | 
    
        data/test/mock_app/db/schema.rb
    CHANGED
    
    
    
        data/test/test_helper.rb
    CHANGED
    
    | 
         @@ -1,7 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              SimpleCov.start { add_filter 'test' }
         
     | 
| 
       4 
     | 
    
         
            -
            end
         
     | 
| 
      
 1 
     | 
    
         
            +
            require 'simplecov'
         
     | 
| 
      
 2 
     | 
    
         
            +
            SimpleCov.start { add_filter 'test' }
         
     | 
| 
       5 
3 
     | 
    
         | 
| 
       6 
4 
     | 
    
         
             
            ENV['RAILS_ENV'] = 'test'
         
     | 
| 
       7 
5 
     | 
    
         
             
            require "mock_app/config/environment"
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: active_scaffold
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 3.4. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 3.4.11
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Many, see README
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2014- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2014-12-10 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: shoulda
         
     | 
| 
         @@ -427,7 +427,7 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       427 
427 
     | 
    
         
             
              requirements:
         
     | 
| 
       428 
428 
     | 
    
         
             
              - - '>='
         
     | 
| 
       429 
429 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       430 
     | 
    
         
            -
                  version: ' 
     | 
| 
      
 430 
     | 
    
         
            +
                  version: '1.9'
         
     | 
| 
       431 
431 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       432 
432 
     | 
    
         
             
              requirements:
         
     | 
| 
       433 
433 
     | 
    
         
             
              - - '>='
         
     | 
| 
         @@ -435,7 +435,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       435 
435 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       436 
436 
     | 
    
         
             
            requirements: []
         
     | 
| 
       437 
437 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       438 
     | 
    
         
            -
            rubygems_version: 2. 
     | 
| 
      
 438 
     | 
    
         
            +
            rubygems_version: 2.1.11
         
     | 
| 
       439 
439 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       440 
440 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       441 
441 
     | 
    
         
             
            summary: Rails 3.2 and 4.0 version of activescaffold supporting prototype and jquery
         
     |