Skip to content

Commit

Permalink
merging fxposter/rails31 with master
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanb committed Jun 29, 2011
2 parents d5b4838 + ad3275b commit 57f3278
Show file tree
Hide file tree
Showing 10 changed files with 69 additions and 51 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -4,3 +4,4 @@
Gemfile.lock
.bundle
log
gemfiles
8 changes: 8 additions & 0 deletions Appraisals
@@ -0,0 +1,8 @@
appraise 'rails3' do
gem 'rails', '~> 3.0.0'
gem 'formtastic'
end

appraise 'rails3_1' do
gem 'rails', '~> 3.1.0.rc4'
end
6 changes: 4 additions & 2 deletions Gemfile
@@ -1,4 +1,6 @@
source "http://rubygems.org"
source "http://rubygems.org/"
gemspec
gem 'sqlite3'
gem 'simple_form'
gem 'formtastic'
gem 'rake'
gem 'appraisal'
1 change: 1 addition & 0 deletions README.rdoc
Expand Up @@ -6,6 +6,7 @@ This gem only works with Rails 3. See the {rails2 branch}[https://github.com/rya

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].


== Setup

Add it to your Gemfile then run +bundle+ to install it.
Expand Down
1 change: 1 addition & 0 deletions Rakefile
@@ -1,4 +1,5 @@
require 'rubygems'
require 'appraisal'
require 'rake'
require 'rspec/core/rake_task'

Expand Down
6 changes: 3 additions & 3 deletions lib/nested_form/builder_mixin.rb
Expand Up @@ -48,12 +48,12 @@ def link_to_remove(*args, &block)
hidden_field(:_destroy) + @template.link_to(*args, &block)
end

def fields_for_with_nested_attributes(association_name, args, block)
def fields_for_with_nested_attributes(association_name, *args)
# TODO Test this better
block ||= Proc.new { |fields| @template.render(:partial => "#{association_name.to_s.singularize}_fields", :locals => {:f => fields}) }
block = args.pop || Proc.new { |fields| @template.render(:partial => "#{association_name.to_s.singularize}_fields", :locals => {:f => fields}) }
@fields ||= {}
@fields[association_name] = block
super(association_name, args, block)
super(association_name, *(args << block))
end

def fields_for_nested_model(name, object, options, block)
Expand Down
4 changes: 2 additions & 2 deletions nested_form.gemspec
Expand Up @@ -10,9 +10,9 @@ Gem::Specification.new do |s|
s.files = Dir["{lib,spec}/**/*", "[A-Z]*"] - ["Gemfile.lock"]
s.require_path = "lib"

s.add_development_dependency "rspec-rails", "~> 2.1.0"
s.add_development_dependency "rspec-rails", "~> 2.6.0"
s.add_development_dependency "mocha"
s.add_development_dependency "rails", "~> 3.0.0"
# s.add_development_dependency "rails", "~> 3.1.0.rc"

s.rubyforge_project = s.name
s.required_rubygems_version = ">= 1.3.4"
Expand Down
2 changes: 1 addition & 1 deletion spec/nested_form/builder_spec.rb
@@ -1,6 +1,6 @@
require "spec_helper"

[NestedForm::Builder, NestedForm::SimpleBuilder, NestedForm::FormtasticBuilder].each do |builder|
[NestedForm::Builder, NestedForm::SimpleBuilder, defined?(NestedForm::FormtasticBuilder) ? NestedForm::FormtasticBuilder : nil].compact.each do |builder|
describe builder do
describe "with no options" do
before(:each) do
Expand Down
34 changes: 18 additions & 16 deletions spec/nested_form/view_helper_spec.rb
@@ -1,45 +1,47 @@
require "spec_helper"

describe NestedForm::ViewHelper do
include RSpec::Rails::HelperExampleGroup

before(:each) do
@template = ActionView::Base.new
@template.output_buffer = ""
@template.stubs(:url_for).returns("")
@template.stubs(:projects_path).returns("")
@template.stubs(:protect_against_forgery?).returns(false)
_routes.draw do
resources :projects
end
end

it "should pass nested form builder to form_for along with other options" do
pending
mock.proxy(@template).form_for(:first, :as => :second, :other => :arg, :builder => NestedForm::Builder) do |form_html|
mock.proxy(_view).form_for(:first, :as => :second, :other => :arg, :builder => NestedForm::Builder) do |form_html|
form_html
end
@template.nested_form_for(:first, :as => :second, :other => :arg) {"form"}
_view.nested_form_for(:first, :as => :second, :other => :arg) {"form"}
end

it "should pass instance of NestedForm::Builder to nested_form_for block" do
@template.nested_form_for(Project.new) do |f|
_view.nested_form_for(Project.new) do |f|
f.should be_instance_of(NestedForm::Builder)
end
end

it "should pass instance of NestedForm::SimpleBuilder to simple_nested_form_for block" do
@template.simple_nested_form_for(Project.new) do |f|
_view.simple_nested_form_for(Project.new) do |f|
f.should be_instance_of(NestedForm::SimpleBuilder)
end
end

it "should pass instance of NestedForm::FormtasticBuilder to semantic_nested_form_for block" do
@template.semantic_nested_form_for(Project.new) do |f|
f.should be_instance_of(NestedForm::FormtasticBuilder)
if defined?(NestedForm::FormtasticBuilder)
it "should pass instance of NestedForm::FormtasticBuilder to semantic_nested_form_for block" do
_view.semantic_nested_form_for(Project.new) do |f|
f.should be_instance_of(NestedForm::FormtasticBuilder)
end
end
end

it "should append content to end of nested form" do
@template.after_nested_form(:tasks) { @template.concat("123") }
@template.after_nested_form(:milestones) { @template.concat("456") }
@template.nested_form_for(Project.new) {}
@template.output_buffer.should include("123456")
_view.after_nested_form(:tasks) { _view.concat("123") }
_view.after_nested_form(:milestones) { _view.concat("456") }
_view.nested_form_for(Project.new) {}
_view.output_buffer.should include("123456")
end
end

57 changes: 30 additions & 27 deletions spec/spec_helper.rb
@@ -1,56 +1,59 @@
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
$LOAD_PATH.unshift(File.dirname(__FILE__))
require "bundler/setup"
require "rails"
require 'action_view/railtie'
Bundler.require(:default)
require 'action_controller/railtie'
require 'active_record'

require "rails"
require "nested_form"
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
ActiveRecord::Migration.verbose = false

# a fake app for initializing the railtie
app = Class.new(Rails::Application)
app.config.secret_token = "token"
app.config.session_store :cookie_store, :key => "_myapp_session"
app.config.active_support.deprecation = :log
app.config.action_controller.perform_caching = false
app.initialize!

require 'action_controller'
require 'active_record'
require 'rspec/rails'

RSpec.configure do |config|
config.mock_with :mocha
end

class TablelessModel < ActiveRecord::Base
def self.columns() @columns ||= []; end

def self.column(name, sql_type = nil, default = nil, null = true)
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
end

def self.quoted_table_name
name.pluralize.underscore
end

def quoted_id
"0"
ActiveRecord::Schema.define do
create_table :projects, :force => true do |t|
t.string :name
end
end

class Project < TablelessModel
column :name, :string
class Project < ActiveRecord::Base
# column :name, :string
has_many :tasks
accepts_nested_attributes_for :tasks
end

class Task < TablelessModel
column :project_id, :integer
column :name, :string
ActiveRecord::Schema.define do
create_table :tasks, :force => true do |t|
t.integer :project_id
t.string :name
end
end
class Task < ActiveRecord::Base
# column :project_id, :integer
# column :name, :string
belongs_to :project
end

class Milestone < TablelessModel
column :task_id, :integer
column :name, :string
ActiveRecord::Schema.define do
create_table :milestones, :force => true do |t|
t.integer :task_id
t.string :name
end
end
class Milestone < ActiveRecord::Base
# column :task_id, :integer
# column :name, :string
belongs_to :task
end

0 comments on commit 57f3278

Please sign in to comment.