embedded_associations 0.0.4 → 4.0.0
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 +7 -0
- data/.travis.yml +2 -2
- data/Gemfile +3 -2
- data/README.md +36 -3
- data/embedded_associations.gemspec +2 -2
- data/lib/embedded_associations.rb +10 -17
- data/lib/embedded_associations/version.rb +1 -1
- data/spec/embedded_associations_spec.rb +10 -6
- data/spec/support/app/app/controllers/posts_controller.rb +16 -2
- data/spec/support/app/app/models/account.rb +0 -1
- data/spec/support/app/app/models/category.rb +0 -1
- data/spec/support/app/app/models/comment.rb +0 -2
- data/spec/support/app/app/models/post.rb +0 -2
- data/spec/support/app/app/models/tag.rb +0 -1
- data/spec/support/app/app/models/user.rb +0 -2
- data/spec/support/app/config/application.rb +0 -6
- metadata +12 -17
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: 931459993427be60c6717d86ee0e387148f34b66
         | 
| 4 | 
            +
              data.tar.gz: e73417bff91288ec6b76e3fafa61a92ea74e10ec
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: 77b9526fdaff3aed1d35ab8a4d7d0e6ea6c2229ec4698c0a41c6fd79bb46d87a400d2c66a1898e177a8705ab94a1e94d79f17449e385b0a38da98f08118daf35
         | 
| 7 | 
            +
              data.tar.gz: 38372d705068862c455f2142a459f093719360af9b8771ccf3597bd1e47e34132dd7af80c53e9ad338efee4df55f4031f9418eebc57041db40e6798d0547c567
         | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -30,6 +30,18 @@ class PostsController < ApplicationController | |
| 30 30 | 
             
            end
         | 
| 31 31 | 
             
            ```
         | 
| 32 32 |  | 
| 33 | 
            +
            Inside of your controllers actions, the `handle_embedded_associations` method should be called:
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            ```ruby
         | 
| 36 | 
            +
            def create
         | 
| 37 | 
            +
              params = params.require(:post).permit(:title, tags: [:name], comments: [:title, user: [:username]])
         | 
| 38 | 
            +
              post = Post.new
         | 
| 39 | 
            +
              handle_embedded_associations(post, params)
         | 
| 40 | 
            +
              post.update_attributes(params)
         | 
| 41 | 
            +
              render json: post
         | 
| 42 | 
            +
            end
         | 
| 43 | 
            +
            ```
         | 
| 44 | 
            +
             | 
| 33 45 | 
             
            Behind the scenes, this will make the controller parse out sub-params passed in and perform the necessary ActiveRecord model manipulation. E.g., consider the params hash below:
         | 
| 34 46 |  | 
| 35 47 | 
             
            ```ruby
         | 
| @@ -47,9 +59,7 @@ Based on the declared `embedded_association`s, the controller will manipulate th | |
| 47 59 |  | 
| 48 60 | 
             
            ### Controller and Model Pre-Requisites
         | 
| 49 61 |  | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
            When defining the relationships in the model, it is also important to set the `autosave` and `dependent` options on the association:
         | 
| 62 | 
            +
            When defining the relationships in the model, it is important to set the `autosave` and `dependent` options on the association:
         | 
| 53 63 |  | 
| 54 64 | 
             
            ```ruby
         | 
| 55 65 | 
             
            class Post < ActiveRecord::Base
         | 
| @@ -58,6 +68,29 @@ class Post < ActiveRecord::Base | |
| 58 68 | 
             
            end
         | 
| 59 69 | 
             
            ```
         | 
| 60 70 |  | 
| 71 | 
            +
            ### Strong Parameters
         | 
| 72 | 
            +
             | 
| 73 | 
            +
            As might be expected, embedded associations must have their attributes permitted via the strong parameters api. For instance, a controller with the following embedded associates configuration:
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            ```ruby
         | 
| 76 | 
            +
            embedded_association :comments => {:user => :account}
         | 
| 77 | 
            +
            embedded_association :user => [:account]
         | 
| 78 | 
            +
            embedded_association [:tags]
         | 
| 79 | 
            +
            embedded_association :category
         | 
| 80 | 
            +
            ```
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            The attributes of the embedded associations must be explicitly permitted:
         | 
| 83 | 
            +
             | 
| 84 | 
            +
            ```ruby
         | 
| 85 | 
            +
            params.require(:post).permit(
         | 
| 86 | 
            +
              :title,
         | 
| 87 | 
            +
              comments: [:content, user: [:name, :email, account: [:note] ]],
         | 
| 88 | 
            +
              user: [:name, :email, account: [:note] ],
         | 
| 89 | 
            +
              tags: [:name],
         | 
| 90 | 
            +
              category: [:name]
         | 
| 91 | 
            +
            )
         | 
| 92 | 
            +
            ```
         | 
| 93 | 
            +
             | 
| 61 94 | 
             
            ## Contributing
         | 
| 62 95 |  | 
| 63 96 | 
             
            1. Fork it
         | 
| @@ -10,12 +10,12 @@ Gem::Specification.new do |gem| | |
| 10 10 | 
             
              gem.email         = ["ghempton@gmail.com"]
         | 
| 11 11 | 
             
              gem.description   = %q{ActiveRecord controller-level support for embedded associations}
         | 
| 12 12 | 
             
              gem.summary       = %q{ActiveRecord controller-level support for embedded associations}
         | 
| 13 | 
            -
              gem.homepage      = "https://github.com/ | 
| 13 | 
            +
              gem.homepage      = "https://github.com/getoutreach/embedded_associations"
         | 
| 14 14 |  | 
| 15 15 | 
             
              gem.files         = `git ls-files`.split($/)
         | 
| 16 16 | 
             
              gem.executables   = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
         | 
| 17 17 | 
             
              gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
         | 
| 18 18 | 
             
              gem.require_paths = ["lib"]
         | 
| 19 19 |  | 
| 20 | 
            -
              gem.add_dependency "railties", ">  | 
| 20 | 
            +
              gem.add_dependency "railties", "> 4.0.0"
         | 
| 21 21 | 
             
            end
         | 
| @@ -11,23 +11,14 @@ module EmbeddedAssociations | |
| 11 11 | 
             
                  def self.embedded_association(definition)
         | 
| 12 12 | 
             
                    unless embedded_associations
         | 
| 13 13 | 
             
                      self.embedded_associations = Definitions.new
         | 
| 14 | 
            -
                      before_filter :handle_embedded_associations, only: [:update, :create, :destroy]
         | 
| 15 14 | 
             
                    end
         | 
| 16 15 | 
             
                    self.embedded_associations = embedded_associations.add_definition(definition)
         | 
| 17 16 | 
             
                  end
         | 
| 18 17 | 
             
                end
         | 
| 19 18 | 
             
              end
         | 
| 20 19 |  | 
| 21 | 
            -
              def handle_embedded_associations
         | 
| 22 | 
            -
                Processor.new(embedded_associations, self).run
         | 
| 23 | 
            -
              end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
              def root_resource
         | 
| 26 | 
            -
                resource
         | 
| 27 | 
            -
              end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
              def root_resource_name
         | 
| 30 | 
            -
                resource_name
         | 
| 20 | 
            +
              def handle_embedded_associations(resource, params)
         | 
| 21 | 
            +
                Processor.new(embedded_associations, self, resource, params).run
         | 
| 31 22 | 
             
              end
         | 
| 32 23 |  | 
| 33 24 | 
             
              def filter_attributes(name, attrs, action)
         | 
| @@ -67,15 +58,19 @@ module EmbeddedAssociations | |
| 67 58 |  | 
| 68 59 | 
             
                attr_reader :definitions
         | 
| 69 60 | 
             
                attr_reader :controller
         | 
| 61 | 
            +
                attr_reader :resource
         | 
| 62 | 
            +
                attr_reader :params
         | 
| 70 63 |  | 
| 71 | 
            -
                def initialize(definitions, controller)
         | 
| 64 | 
            +
                def initialize(definitions, controller, resource, params)
         | 
| 72 65 | 
             
                  @definitions = definitions
         | 
| 73 66 | 
             
                  @controller = controller
         | 
| 67 | 
            +
                  @params = params
         | 
| 68 | 
            +
                  @resource = resource
         | 
| 74 69 | 
             
                end
         | 
| 75 70 |  | 
| 76 71 | 
             
                def run
         | 
| 77 72 | 
             
                  definitions.each do |definition|
         | 
| 78 | 
            -
                    handle_resource(definition,  | 
| 73 | 
            +
                    handle_resource(definition, resource, params)
         | 
| 79 74 | 
             
                  end
         | 
| 80 75 | 
             
                end
         | 
| 81 76 |  | 
| @@ -94,7 +89,7 @@ module EmbeddedAssociations | |
| 94 89 | 
             
                  definition.each do |name, child_definition|
         | 
| 95 90 | 
             
                    reflection = parent.class.reflect_on_association(name)
         | 
| 96 91 | 
             
                    attrs = parent_params && parent_params.delete(name.to_s)
         | 
| 97 | 
            -
             | 
| 92 | 
            +
             | 
| 98 93 | 
             
                    if reflection.collection?
         | 
| 99 94 | 
             
                      attrs ||= []
         | 
| 100 95 | 
             
                      handle_plural_resource parent, name, attrs, child_definition
         | 
| @@ -115,7 +110,6 @@ module EmbeddedAssociations | |
| 115 110 | 
             
                  end
         | 
| 116 111 |  | 
| 117 112 | 
             
                  attr_array.each do |attrs|
         | 
| 118 | 
            -
                    attrs = ActionController::Parameters.new(attrs)
         | 
| 119 113 | 
             
                    if id = attrs['id']
         | 
| 120 114 | 
             
                      # can't use current_assoc.find(id), see http://stackoverflow.com/questions/11605120/autosave-ignored-on-has-many-relation-what-am-i-missing
         | 
| 121 115 | 
             
                      r = current_assoc.find{|r| r.id == id.to_i}
         | 
| @@ -135,8 +129,7 @@ module EmbeddedAssociations | |
| 135 129 |  | 
| 136 130 | 
             
                def handle_singular_resource(parent, name, attrs, child_definition)
         | 
| 137 131 | 
             
                  current_assoc = parent.send(name)
         | 
| 138 | 
            -
             | 
| 139 | 
            -
                  
         | 
| 132 | 
            +
             | 
| 140 133 | 
             
                  if r = current_assoc
         | 
| 141 134 | 
             
                    if attrs
         | 
| 142 135 | 
             
                      attrs = controller.send(:filter_attributes, r.class.name, attrs, :update)
         | 
| @@ -9,6 +9,7 @@ describe PostsController, type: :controller do | |
| 9 9 |  | 
| 10 10 | 
             
                  it "should create child records" do
         | 
| 11 11 | 
             
                    json = post :create, post: {
         | 
| 12 | 
            +
                      title: 'ma post',
         | 
| 12 13 | 
             
                      tags: [{},{}]
         | 
| 13 14 | 
             
                    }
         | 
| 14 15 |  | 
| @@ -23,7 +24,7 @@ describe PostsController, type: :controller do | |
| 23 24 | 
             
                context "updating" do
         | 
| 24 25 |  | 
| 25 26 | 
             
                  let(:tags) {[Tag.create, Tag.create]}
         | 
| 26 | 
            -
                  let(:resource) { Post.create( | 
| 27 | 
            +
                  let(:resource) { Post.create(tags: tags) }
         | 
| 27 28 | 
             
                  let(:hash) { serialize(resource) }
         | 
| 28 29 |  | 
| 29 30 | 
             
                  it "should create new child records" do
         | 
| @@ -68,6 +69,7 @@ describe PostsController, type: :controller do | |
| 68 69 |  | 
| 69 70 | 
             
                  it "should create child record" do
         | 
| 70 71 | 
             
                    json = post :create, post: {
         | 
| 72 | 
            +
                      title: 'ma post',
         | 
| 71 73 | 
             
                      category: {name: 'ember-data'}
         | 
| 72 74 | 
             
                    }
         | 
| 73 75 |  | 
| @@ -100,7 +102,7 @@ describe PostsController, type: :controller do | |
| 100 102 |  | 
| 101 103 | 
             
                  context do
         | 
| 102 104 |  | 
| 103 | 
            -
                    let(:resource) { Post.create( | 
| 105 | 
            +
                    let(:resource) { Post.create(category: Category.create(name: 'ember')) }
         | 
| 104 106 |  | 
| 105 107 | 
             
                    it "should destroy nil child record" do
         | 
| 106 108 | 
             
                      hash[:category] = nil
         | 
| @@ -134,6 +136,7 @@ describe PostsController, type: :controller do | |
| 134 136 |  | 
| 135 137 | 
             
                  it "should create hierarchy" do
         | 
| 136 138 | 
             
                    json = post :create, post: {
         | 
| 139 | 
            +
                      title: 'ma post',
         | 
| 137 140 | 
             
                      user: {name: 'G$', account: {}}
         | 
| 138 141 | 
             
                    }
         | 
| 139 142 |  | 
| @@ -169,7 +172,7 @@ describe PostsController, type: :controller do | |
| 169 172 |  | 
| 170 173 | 
             
                  context do
         | 
| 171 174 |  | 
| 172 | 
            -
                    let(:resource) { Post.create({user: User.create({name: 'G$', account: Account.create} | 
| 175 | 
            +
                    let(:resource) { Post.create({user: User.create({name: 'G$', account: Account.create})}) }
         | 
| 173 176 |  | 
| 174 177 | 
             
                    it "should destroy nil child hierarchy" do
         | 
| 175 178 | 
             
                      hash[:user] = nil
         | 
| @@ -227,8 +230,9 @@ describe PostsController, type: :controller do | |
| 227 230 |  | 
| 228 231 | 
             
                context "creating" do
         | 
| 229 232 |  | 
| 230 | 
            -
                  it "should create hierarchy" do
         | 
| 233 | 
            +
                  it "should create hierarchy", focus: true do
         | 
| 231 234 | 
             
                    json = post :create, post: {
         | 
| 235 | 
            +
                      title: 'ma post',
         | 
| 232 236 | 
             
                      comments: [{user: {name: 'G$', account: {}}}]
         | 
| 233 237 | 
             
                    }
         | 
| 234 238 |  | 
| @@ -271,7 +275,7 @@ describe PostsController, type: :controller do | |
| 271 275 | 
             
                    let(:resource) {
         | 
| 272 276 | 
             
                      p = Post.create
         | 
| 273 277 | 
             
                      c = p.comments.create
         | 
| 274 | 
            -
                      u = c.create_user({account: Account.create} | 
| 278 | 
            +
                      u = c.create_user({account: Account.create})
         | 
| 275 279 | 
             
                      c.save
         | 
| 276 280 | 
             
                      p
         | 
| 277 281 | 
             
                    }
         | 
| @@ -321,4 +325,4 @@ describe PostsController, type: :controller do | |
| 321 325 |  | 
| 322 326 | 
             
              end
         | 
| 323 327 |  | 
| 324 | 
            -
            end
         | 
| 328 | 
            +
            end
         | 
| @@ -9,12 +9,16 @@ class PostsController < ApplicationController | |
| 9 9 | 
             
              attr_accessor :resource
         | 
| 10 10 |  | 
| 11 11 | 
             
              def create
         | 
| 12 | 
            -
                 | 
| 12 | 
            +
                params = post_params
         | 
| 13 | 
            +
                handle_embedded_associations(resource, params)
         | 
| 14 | 
            +
                resource.update_attributes(params)
         | 
| 13 15 | 
             
                render json: resource
         | 
| 14 16 | 
             
              end
         | 
| 15 17 |  | 
| 16 18 | 
             
              def update
         | 
| 17 | 
            -
                 | 
| 19 | 
            +
                params = post_params
         | 
| 20 | 
            +
                handle_embedded_associations(resource, params)
         | 
| 21 | 
            +
                resource.update_attributes(params)
         | 
| 18 22 | 
             
                render json: resource
         | 
| 19 23 | 
             
              end
         | 
| 20 24 |  | 
| @@ -37,4 +41,14 @@ class PostsController < ApplicationController | |
| 37 41 | 
             
                'post'
         | 
| 38 42 | 
             
              end
         | 
| 39 43 |  | 
| 44 | 
            +
              def post_params
         | 
| 45 | 
            +
                params.require(:post).permit(
         | 
| 46 | 
            +
                  :title,
         | 
| 47 | 
            +
                  comments: [:content, user: [:name, :email, account: [:note] ]],
         | 
| 48 | 
            +
                  user: [:name, :email, account: [:note] ],
         | 
| 49 | 
            +
                  tags: [:name],
         | 
| 50 | 
            +
                  category: [:name]
         | 
| 51 | 
            +
                )
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 40 54 | 
             
            end
         | 
| @@ -47,12 +47,6 @@ module App | |
| 47 47 | 
             
                # like if you have constraints or database-specific column types
         | 
| 48 48 | 
             
                # config.active_record.schema_format = :sql
         | 
| 49 49 |  | 
| 50 | 
            -
                # Enforce whitelist mode for mass assignment.
         | 
| 51 | 
            -
                # This will create an empty whitelist of attributes available for mass-assignment for all models
         | 
| 52 | 
            -
                # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
         | 
| 53 | 
            -
                # parameters by using an attr_accessible or attr_protected declaration.
         | 
| 54 | 
            -
                config.active_record.whitelist_attributes = true
         | 
| 55 | 
            -
             | 
| 56 50 | 
             
                # Enable the asset pipeline
         | 
| 57 51 | 
             
                config.assets.enabled = true
         | 
| 58 52 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,32 +1,29 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: embedded_associations
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0 | 
| 5 | 
            -
              prerelease: 
         | 
| 4 | 
            +
              version: 4.0.0
         | 
| 6 5 | 
             
            platform: ruby
         | 
| 7 6 | 
             
            authors:
         | 
| 8 7 | 
             
            - Gordon L. Hempton
         | 
| 9 8 | 
             
            autorequire: 
         | 
| 10 9 | 
             
            bindir: bin
         | 
| 11 10 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 11 | 
            +
            date: 2014-03-11 00:00:00.000000000 Z
         | 
| 13 12 | 
             
            dependencies:
         | 
| 14 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 14 | 
             
              name: railties
         | 
| 16 15 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 | 
            -
                none: false
         | 
| 18 16 | 
             
                requirements:
         | 
| 19 | 
            -
                - -  | 
| 17 | 
            +
                - - '>'
         | 
| 20 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 21 | 
            -
                    version:  | 
| 19 | 
            +
                    version: 4.0.0
         | 
| 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:  | 
| 26 | 
            +
                    version: 4.0.0
         | 
| 30 27 | 
             
            description: ActiveRecord controller-level support for embedded associations
         | 
| 31 28 | 
             
            email:
         | 
| 32 29 | 
             
            - ghempton@gmail.com
         | 
| @@ -91,29 +88,28 @@ files: | |
| 91 88 | 
             
            - spec/support/app/log/.gitkeep
         | 
| 92 89 | 
             
            - spec/support/app/script/rails
         | 
| 93 90 | 
             
            - spec/support/serialization_helpers.rb
         | 
| 94 | 
            -
            homepage: https://github.com/ | 
| 91 | 
            +
            homepage: https://github.com/getoutreach/embedded_associations
         | 
| 95 92 | 
             
            licenses: []
         | 
| 93 | 
            +
            metadata: {}
         | 
| 96 94 | 
             
            post_install_message: 
         | 
| 97 95 | 
             
            rdoc_options: []
         | 
| 98 96 | 
             
            require_paths:
         | 
| 99 97 | 
             
            - lib
         | 
| 100 98 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 101 | 
            -
              none: false
         | 
| 102 99 | 
             
              requirements:
         | 
| 103 | 
            -
              - -  | 
| 100 | 
            +
              - - '>='
         | 
| 104 101 | 
             
                - !ruby/object:Gem::Version
         | 
| 105 102 | 
             
                  version: '0'
         | 
| 106 103 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 107 | 
            -
              none: false
         | 
| 108 104 | 
             
              requirements:
         | 
| 109 | 
            -
              - -  | 
| 105 | 
            +
              - - '>='
         | 
| 110 106 | 
             
                - !ruby/object:Gem::Version
         | 
| 111 107 | 
             
                  version: '0'
         | 
| 112 108 | 
             
            requirements: []
         | 
| 113 109 | 
             
            rubyforge_project: 
         | 
| 114 | 
            -
            rubygems_version:  | 
| 110 | 
            +
            rubygems_version: 2.0.14
         | 
| 115 111 | 
             
            signing_key: 
         | 
| 116 | 
            -
            specification_version:  | 
| 112 | 
            +
            specification_version: 4
         | 
| 117 113 | 
             
            summary: ActiveRecord controller-level support for embedded associations
         | 
| 118 114 | 
             
            test_files:
         | 
| 119 115 | 
             
            - spec/embedded_associations_spec.rb
         | 
| @@ -163,4 +159,3 @@ test_files: | |
| 163 159 | 
             
            - spec/support/app/log/.gitkeep
         | 
| 164 160 | 
             
            - spec/support/app/script/rails
         | 
| 165 161 | 
             
            - spec/support/serialization_helpers.rb
         | 
| 166 | 
            -
            has_rdoc: 
         |