Skip to content

Commit

Permalink
render form as erector widget
Browse files Browse the repository at this point in the history
  • Loading branch information
ajb committed Dec 28, 2013
1 parent 910d347 commit aeb98f0
Show file tree
Hide file tree
Showing 13 changed files with 92 additions and 118 deletions.
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ gemspec
# Explicitly require gems
gem 'carrierwave', require: 'carrierwave'
gem 'database_cleaner', require: 'database_cleaner'
gem 'erector-rails4', require: 'erector'
gem 'geocoder', require: 'geocoder'

# Declare any dependencies that are still in development here instead of in
Expand Down
11 changes: 8 additions & 3 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ PATH
specs:
formbuilder-rb (0.0.4)
carrierwave
erector-rails4
geocoder
pg
rails (>= 4.0.0)
Expand Down Expand Up @@ -59,6 +60,9 @@ GEM
daemons (1.1.9)
database_cleaner (1.2.0)
diff-lcs (1.2.4)
erector-rails4 (0.0.2)
rails (>= 4.0)
treetop (>= 1.2.3)
erubis (2.7.0)
eventmachine (1.0.3)
factory_girl (4.2.0)
Expand Down Expand Up @@ -98,7 +102,7 @@ GEM
multi_json (1.8.0)
nokogiri (1.6.0)
mini_portile (~> 0.5.0)
pg (0.17.0)
pg (0.17.1)
polyglot (0.3.3)
pry (0.9.12.2)
coderay (~> 1.0.5)
Expand Down Expand Up @@ -149,12 +153,12 @@ GEM
simplecov-html (~> 0.7.1)
simplecov-html (0.7.1)
slop (3.4.6)
sprockets (2.10.0)
sprockets (2.10.1)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sprockets-rails (2.0.0)
sprockets-rails (2.0.1)
actionpack (>= 3.0)
activesupport (>= 3.0)
sprockets (~> 2.8)
Expand Down Expand Up @@ -185,6 +189,7 @@ DEPENDENCIES
carrierwave
coveralls
database_cleaner
erector-rails4
factory_girl_rails
formbuilder-rb!
geocoder
Expand Down
1 change: 1 addition & 0 deletions formbuilder-rb.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ Gem::Specification.new do |s|
s.add_dependency "rails", ">= 4.0.0"

s.add_dependency 'carrierwave'
s.add_dependency 'erector-rails4'
s.add_dependency 'geocoder'
s.add_dependency 'pg'
s.add_dependency 'rmagick'
Expand Down
3 changes: 2 additions & 1 deletion lib/formbuilder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
require "formbuilder/entry"
require "formbuilder/entry_renderer"
require "formbuilder/entry_validator"
require "formbuilder/form_renderer"
require "formbuilder/views/form"
require "formbuilder/views/form_field"

module Formbuilder
def self.root
Expand Down
99 changes: 0 additions & 99 deletions lib/formbuilder/form_renderer.rb

This file was deleted.

30 changes: 30 additions & 0 deletions lib/formbuilder/views/form.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
module Formbuilder
module Views
class Form < Erector::Widget

needs :form, :entry, action: '', method: 'POST'

def content
form_tag @action, method: @method, class: 'formbuilder-form', multipart: true do
fields
actions
end
end

# @todo csrf

def fields
@form.response_fields.each do |rf|
widget Formbuilder::Views::FormField.new(response_field: rf, entry: @entry)
end
end

def actions
div(class: 'form-actions') {
button.button.primary 'Submit'
}
end

end
end
end
41 changes: 41 additions & 0 deletions lib/formbuilder/views/form_field.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
module Formbuilder
module Views
class FormField < Erector::Widget

needs :response_field, :entry

def content
@value = @entry.try(:response_value, @response_field)

div(class: "fb-field-wrapper response-field-#{@response_field.field_type} #{@entry.try(:error_for, @response_field) && 'error'}") {
render_label if @response_field.input_field
rawtext @response_field.render_input(@value, entry: @entry)
div.clear
render_error if @response_field.input_field && @entry.error_for(@response_field)
render_description if @response_field.input_field && @response_field[:field_options]["description"].present?
}
end

private
def render_label
label(for: "response_fields_#{@response_field.id}") {
text @response_field[:label]
abbr('*', title: 'required') if @response_field.required?
}
end

def render_error
span(class: "help-block validation-message-wrapper") {
text @entry.error_for(@response_field)
}
end

def render_description
span(class: 'help-block') {
text simple_format(@response_field[:field_options]["description"])
}
end

end
end
end
2 changes: 2 additions & 0 deletions spec/dummy/app/views/test/_form.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class Views::Test::Form < Formbuilder::Views::Form
end
2 changes: 1 addition & 1 deletion spec/dummy/app/views/test/show_form.html.erb
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<%= Formbuilder::FormRenderer.new(@form, @entry).to_html %>
<%= render partial: 'form' %>
2 changes: 2 additions & 0 deletions spec/dummy/config/application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ class Application < Rails::Application
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.

config.autoload_paths += %W(#{config.root}/app)

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'
Expand Down

This file was deleted.

10 changes: 4 additions & 6 deletions spec/features/form_renderer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,18 @@

subject { page }
let!(:form) { FactoryGirl.create(:form) }
let!(:entry) { e = Entry.new(form: form); e.save(validate: false); e }
let!(:entry) { Entry.create(form: form, skip_validation: true) }

context 'with a text field' do

before do
form.response_fields.create(label: "Text", type: "Formbuilder::ResponseFieldText", sort_order: 0)
@rf = form.response_fields.create(label: "Textfield", type: "Formbuilder::ResponseFieldText", sort_order: 0)
visit test_form_path(form.id, entry.id)
end

it 'should render the field and its label' do
pending
# label
# required?
# description
page.should have_text 'Textfield'
page.should have_field "response_fields_#{@rf.id}"
end

it 'should render errors'
Expand Down
7 changes: 0 additions & 7 deletions spec/lib/formbuilder/form_renderer_spec.rb

This file was deleted.

0 comments on commit aeb98f0

Please sign in to comment.