nested_form 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/CHANGELOG.rdoc +12 -0
  2. data/README.rdoc +30 -2
  3. data/Rakefile +23 -4
  4. data/lib/generators/nested_form/install_generator.rb +1 -1
  5. data/lib/nested_form/{builder.rb → builder_mixin.rb} +4 -4
  6. data/lib/nested_form/builders.rb +23 -0
  7. data/lib/nested_form/engine.rb +14 -0
  8. data/lib/nested_form/view_helper.rb +25 -9
  9. data/lib/nested_form.rb +1 -2
  10. data/spec/dummy/Rakefile +7 -0
  11. data/spec/dummy/app/assets/javascripts/application.js +5 -0
  12. data/spec/dummy/app/assets/javascripts/jquery.js +8981 -0
  13. data/spec/dummy/app/assets/javascripts/jquery_nested_form.js +71 -0
  14. data/spec/dummy/app/assets/javascripts/projects.js +2 -0
  15. data/spec/dummy/app/assets/javascripts/prototype.js +6082 -0
  16. data/{lib/generators/nested_form/templates → spec/dummy/app/assets/javascripts}/prototype_nested_form.js +0 -0
  17. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  18. data/spec/dummy/app/assets/stylesheets/projects.css +4 -0
  19. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  20. data/spec/dummy/app/controllers/projects_controller.rb +5 -0
  21. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  22. data/spec/dummy/app/helpers/projects_helper.rb +2 -0
  23. data/spec/dummy/app/models/milestone.rb +3 -0
  24. data/spec/dummy/app/models/project.rb +4 -0
  25. data/spec/dummy/app/models/task.rb +3 -0
  26. data/spec/dummy/app/views/layouts/application.html.erb +11 -0
  27. data/spec/dummy/app/views/projects/new.html.erb +14 -0
  28. data/spec/dummy/config/application.rb +42 -0
  29. data/spec/dummy/config/boot.rb +10 -0
  30. data/spec/dummy/config/database.yml +25 -0
  31. data/spec/dummy/config/environment.rb +5 -0
  32. data/spec/dummy/config/environments/development.rb +27 -0
  33. data/spec/dummy/config/environments/production.rb +54 -0
  34. data/spec/dummy/config/environments/test.rb +39 -0
  35. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  36. data/spec/dummy/config/initializers/inflections.rb +10 -0
  37. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  38. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  39. data/spec/dummy/config/initializers/session_store.rb +8 -0
  40. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  41. data/spec/dummy/config/locales/en.yml +5 -0
  42. data/spec/dummy/config/routes.rb +59 -0
  43. data/spec/dummy/config.ru +4 -0
  44. data/spec/dummy/db/development.sqlite3 +0 -0
  45. data/spec/dummy/db/migrate/20110710143903_initial_tables.rb +23 -0
  46. data/spec/dummy/db/schema.rb +29 -0
  47. data/spec/dummy/db/test.sqlite3 +0 -0
  48. data/spec/dummy/public/404.html +26 -0
  49. data/spec/dummy/public/422.html +26 -0
  50. data/spec/dummy/public/500.html +26 -0
  51. data/spec/dummy/public/favicon.ico +0 -0
  52. data/spec/dummy/script/rails +6 -0
  53. data/spec/dummy/test/functional/projects_controller_test.rb +7 -0
  54. data/spec/dummy/test/unit/helpers/projects_helper_test.rb +4 -0
  55. data/spec/form_spec.rb +31 -0
  56. data/spec/nested_form/builder_spec.rb +33 -31
  57. data/spec/nested_form/view_helper_spec.rb +26 -12
  58. data/spec/spec_helper.rb +9 -48
  59. metadata +84 -59
  60. data/Gemfile +0 -3
  61. data/lib/generators/nested_form/templates/jquery_nested_form.js +0 -51
data/CHANGELOG.rdoc CHANGED
@@ -1,9 +1,21 @@
1
+ 0.2.0 (February 7, 2012)
2
+
3
+ * Integration tests (thanks fxposter) - issue #58
4
+
5
+ * Improved simple_form and 3.1 support (thanks fxposter)
6
+
7
+ * nested:fieldAdded event includes the newly added field (thanks harrigan)
8
+
9
+ * other minor bug fixes
10
+
11
+
1
12
  0.1.1 (April 23, 2011)
2
13
 
3
14
  * Support HTML options and block in add/remove link - issue #31
4
15
 
5
16
  * Added new RegEx to generate new objects IDs correctly - issue #26 and issue #30
6
17
 
18
+
7
19
  0.1.0 (March 26, 2011)
8
20
 
9
21
  * Prefix new records with "new_" so there's no possible conflict with existing records - issue #21
data/README.rdoc CHANGED
@@ -7,6 +7,29 @@ This gem only works with Rails 3. See the {rails2 branch}[https://github.com/rya
7
7
  An example project showing how this works is available in the {complex-nested-forms/nested_form branch}[https://github.com/ryanb/complex-form-examples/tree/nested_form].
8
8
 
9
9
 
10
+ == Changes in this repo
11
+
12
+ === Enhanced jQuery javascript template
13
+
14
+ Now you can override default behavior of inserting new subforms into your form (jQuery-only feature, sorry). For example:
15
+
16
+ window.nestedFormEvents.insertFields = function(content, assoc, link) {
17
+ return $(link).closest('form').find(assoc + '_fields').append($(content));
18
+ }
19
+
20
+ === Rails 3.1 support (with asset pipeline)
21
+
22
+ There's a small fix for Rails 3.1 form handling.
23
+ Also support of Rails 3.1 led me to huge refactor of specs setup (now using Helper specs from rspec-rails instead of custom implementation spec context).
24
+
25
+ Formtastic is supported only with Rails 3.0, Rails 3.1 integration is not available now.
26
+
27
+ Asset pipeline is supported. So you can use
28
+
29
+ //= require jquery_nested_form
30
+ // or
31
+ //= require prototype_nested_form
32
+
10
33
  == Setup
11
34
 
12
35
  Add it to your Gemfile then run +bundle+ to install it.
@@ -41,6 +64,11 @@ You will then be able to use +link_to_add+ and +link_to_remove+ helper methods o
41
64
  <p><%= f.link_to_add "Add a task", :tasks %></p>
42
65
 
43
66
 
67
+ == SimpleForm and Formtastic Support
68
+
69
+ Use <tt>simple_nested_form_for</tt> or <tt>semantic_nested_form_for</tt> for SimpleForm and Formtastic support respectively. This is feature is not yet in a Gem release but is in the Git repo.
70
+
71
+
44
72
  == Partials
45
73
 
46
74
  It is often desirable to move the nested fields into a partial to keep things organized. If you don't supply a block to fields_for it will look for a partial and use that.
@@ -57,10 +85,10 @@ If you are using jQuery, <tt>nested:fieldAdded</tt> and <tt>nested:fieldRemoved<
57
85
 
58
86
  == Special Thanks
59
87
 
60
- First of all, thanks ro Ryan Bates for this gem. Awesome work.
61
-
62
88
  This gem was originally based on the solution by Tim Riley in his {complex-form-examples fork}[https://github.com/timriley/complex-form-examples/tree/unobtrusive-jquery-deep-fix2].
63
89
 
64
90
  Thank you Andrew Manshin for the Rails 3 transition, {Andrea Singh}[https://github.com/madebydna] for converting to a gem and {Peter Giacomo Lombardo}[https://github.com/pglombardo] for Prototype support.
65
91
 
66
92
  Andrea also wrote a great {blog post}[http://blog.madebydna.com/all/code/2010/10/07/dynamic-nested-froms-with-the-nested-form-gem.html] on the internal workings of this gem.
93
+
94
+ Thanks {Pavel Forkert}[https://github.com/fxposter] for the SimpleForm and Formtastic support.
data/Rakefile CHANGED
@@ -1,10 +1,29 @@
1
1
  require 'rubygems'
2
+ # require 'appraisal'
2
3
  require 'rake'
3
- require 'rspec/core/rake_task'
4
4
 
5
- desc "Run RSpec"
6
- RSpec::Core::RakeTask.new do |t|
7
- t.verbose = false
5
+ begin
6
+ require 'rspec/core/rake_task'
7
+ desc "Run RSpec"
8
+ RSpec::Core::RakeTask.new do |t|
9
+ t.verbose = false
10
+ end
11
+ rescue LoadError
12
+ puts "You should run rake spec:install in order to install all corresponding gems!"
8
13
  end
9
14
 
10
15
  task :default => :spec
16
+ namespace :spec do
17
+ task :install do
18
+ puts `bundle install --gemfile=gemfiles/Gemfile.rails3_0`
19
+ puts `bundle install --gemfile=gemfiles/Gemfile.rails3_1`
20
+ end
21
+
22
+ task :all do
23
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../gemfiles/Gemfile.rails3_0', __FILE__)
24
+ Rake::Task["spec"].execute
25
+
26
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../gemfiles/Gemfile.rails3_1', __FILE__)
27
+ Rake::Task["spec"].execute
28
+ end
29
+ end
@@ -2,7 +2,7 @@ module NestedForm
2
2
  module Generators
3
3
  class InstallGenerator < Rails::Generators::Base
4
4
  def self.source_root
5
- File.dirname(__FILE__) + "/templates"
5
+ File.expand_path('../../../../vendor/assets/javascripts', __FILE__)
6
6
  end
7
7
 
8
8
  def copy_jquery_file
@@ -1,5 +1,5 @@
1
1
  module NestedForm
2
- class Builder < ::ActionView::Helpers::FormBuilder
2
+ module BuilderMixin
3
3
  # Adds a link to insert a new associated records. The first argument is the name of the link, the second is the name of the association.
4
4
  #
5
5
  # f.link_to_add("Add Task", :tasks)
@@ -48,12 +48,12 @@ module NestedForm
48
48
  hidden_field(:_destroy) + @template.link_to(*args, &block)
49
49
  end
50
50
 
51
- def fields_for_with_nested_attributes(association_name, args, block)
51
+ def fields_for_with_nested_attributes(association_name, *args)
52
52
  # TODO Test this better
53
- block ||= Proc.new { |fields| @template.render(:partial => "#{association_name.to_s.singularize}_fields", :locals => {:f => fields}) }
53
+ block = args.pop || Proc.new { |fields| @template.render(:partial => "#{association_name.to_s.singularize}_fields", :locals => {:f => fields}) }
54
54
  @fields ||= {}
55
55
  @fields[association_name] = block
56
- super(association_name, args, block)
56
+ super(association_name, *(args << block))
57
57
  end
58
58
 
59
59
  def fields_for_nested_model(name, object, options, block)
@@ -0,0 +1,23 @@
1
+ require 'nested_form/builder_mixin'
2
+
3
+ module NestedForm
4
+ class Builder < ::ActionView::Helpers::FormBuilder
5
+ include ::NestedForm::BuilderMixin
6
+ end
7
+
8
+ begin
9
+ require 'simple_form'
10
+ class SimpleBuilder < ::SimpleForm::FormBuilder
11
+ include ::NestedForm::BuilderMixin
12
+ end
13
+ rescue LoadError
14
+ end
15
+
16
+ begin
17
+ require 'formtastic'
18
+ class FormtasticBuilder < (defined?(::Formtastic::FormBuilder) ? Formtastic::FormBuilder : ::Formtastic::SemanticFormBuilder)
19
+ include ::NestedForm::BuilderMixin
20
+ end
21
+ rescue LoadError
22
+ end
23
+ end
@@ -0,0 +1,14 @@
1
+ require 'rails'
2
+
3
+ module NestedForm
4
+ class Engine < ::Rails::Engine
5
+ initializer 'nested_form' do |app|
6
+ ActiveSupport.on_load(:action_view) do
7
+ require "nested_form/view_helper"
8
+ class ActionView::Base
9
+ include NestedForm::ViewHelper
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,13 +1,24 @@
1
+ require 'nested_form/builders'
2
+
1
3
  module NestedForm
2
4
  module ViewHelper
3
5
  def nested_form_for(*args, &block)
4
6
  options = args.extract_options!.reverse_merge(:builder => NestedForm::Builder)
5
- output = form_for(*(args << options), &block)
6
- @after_nested_form_callbacks ||= []
7
- fields = @after_nested_form_callbacks.map do |callback|
8
- callback.call
7
+ form_for(*(args << options), &block) << after_nested_form_callbacks
8
+ end
9
+
10
+ if defined?(NestedForm::SimpleBuilder)
11
+ def simple_nested_form_for(*args, &block)
12
+ options = args.extract_options!.reverse_merge(:builder => NestedForm::SimpleBuilder)
13
+ simple_form_for(*(args << options), &block) << after_nested_form_callbacks
14
+ end
15
+ end
16
+
17
+ if defined?(NestedForm::FormtasticBuilder)
18
+ def semantic_nested_form_for(*args, &block)
19
+ options = args.extract_options!.reverse_merge(:builder => NestedForm::FormtasticBuilder)
20
+ semantic_form_for(*(args << options), &block) << after_nested_form_callbacks
9
21
  end
10
- output << fields.join(" ").html_safe
11
22
  end
12
23
 
13
24
  def after_nested_form(association, &block)
@@ -18,9 +29,14 @@ module NestedForm
18
29
  @after_nested_form_callbacks << block
19
30
  end
20
31
  end
21
- end
22
- end
23
32
 
24
- class ActionView::Base
25
- include NestedForm::ViewHelper
33
+ private
34
+ def after_nested_form_callbacks
35
+ @after_nested_form_callbacks ||= []
36
+ fields = @after_nested_form_callbacks.map do |callback|
37
+ callback.call
38
+ end
39
+ fields.join(" ").html_safe
40
+ end
41
+ end
26
42
  end
data/lib/nested_form.rb CHANGED
@@ -1,2 +1 @@
1
- require "nested_form/builder"
2
- require "nested_form/view_helper"
1
+ require "nested_form/engine"
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
3
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
+
5
+ require File.expand_path('../config/application', __FILE__)
6
+
7
+ Dummy::Application.load_tasks
@@ -0,0 +1,5 @@
1
+ // This is a manifest file that'll be compiled into including all the files listed below.
2
+ // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3
+ // be included in the compiled file accessible from http://example.com/assets/application.js
4
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
+ // the compiled file.