Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 356 lines (259 sloc) 13.355 kb
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
1 h1. Formtastic Sneaky Preview
dcf8beb Initial Commit
Justin French authored
2
3 Formtastic is a Rails FormBuilder DSL (with some other goodies) to make it far easier to create beautiful, semantically rich, syntactically awesome, readily stylable and wonderfully accessible HTML forms in your Rails applications.
4
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
5 h2. The Story
dcf8beb Initial Commit
Justin French authored
6
6734cfd @justinfrench sme typos and cleanups in the readme
authored
7 Hacked together forms were easy, but awesome forms with decent semantics, rich mark-up and plenty of CSS hooks were incredibly painful. I was discouraged from doing things properly because it was too much mark-up and code to write. One day, I finally had enough, so I opened up my text editor, and wrote a DSL for how I'd like to author forms:
dcf8beb Initial Commit
Justin French authored
8
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
9 <pre>
7e3874a @justinfrench trying to fix README formatting of <'s at the start of lines
authored
10 <% semantic_form_for @article do |form| %>
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
11
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand vers…
authored
12 <% form.inputs :name => "Basic" do %>
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
13 <%= form.input :title %>
14 <%= form.input :body %>
15 <%= form.input :section_id %>
16 <%= form.input :publication_state_id, :as => :radio %>
17 <%= form.input :author_id, :as => :select %>
18 <%= form.input :allow_comments, :label => "Allow commenting on this article" %>
19 <% end %>
20
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand vers…
authored
21 <% form.inputs :name => "Advanced" do %>
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
22 <%= form.input :keywords, :required => false, :hint => "Example: ruby, rails, forms" %>
7e3874a @justinfrench trying to fix README formatting of <'s at the start of lines
authored
23 <%= form.input :extract, :required => false %>
24 <%= form.input :description, :required => false %>
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
25 <%= form.input :url_title, :required => false %>
7e3874a @justinfrench trying to fix README formatting of <'s at the start of lines
authored
26 <% end %>
27
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
28 <% form.buttons do %>
29 <%= form.commit_button %>
7e3874a @justinfrench trying to fix README formatting of <'s at the start of lines
authored
30 <% end %>
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
31
dcf8beb Initial Commit
Justin French authored
32 <% end %>
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
33 </pre>
34
6734cfd @justinfrench sme typos and cleanups in the readme
authored
35 I also wrote the accompanying HTML output I expected, favoring something very similar to the fieldsets, lists and other semantic elements Aaron Gustafson presented in "Learning to Love Forms":http://www.slideshare.net/AaronGustafson/learning-to-love-forms-web-directions-south-07, hacking together enough Ruby to prove it could be done.
dcf8beb Initial Commit
Justin French authored
36
37
15e0bd9 updated the README a little to match last night's slides
Justin French authored
38 h2. Why?
39
40 * web apps = lots of forms
41 * forms are so friggin' boring to code
42 * semantically rich & accessible forms really are possible
43 * the "V" is way behind the "M" and "C" in Rails' MVC – it's the ugly sibling
dcf8beb Initial Commit
Justin French authored
44 * best practices and common patterns have to start somewhere
15e0bd9 updated the README a little to match last night's slides
Justin French authored
45 * i need a challenge
dcf8beb Initial Commit
Justin French authored
46
47
15e0bd9 updated the README a little to match last night's slides
Justin French authored
48 h2. Opinions
49
50 * it should be easier to do things the right way than the wrong way
51 * sometimes _more mark-up_ is better
52 * elements and attribute hooks are _gold_ for stylesheet authors
53 * make the common things we do easy, yet still ensure uncommon things are still possible
54
dcf8beb Initial Commit
Justin French authored
55
5a39443 @justinfrench bulking up the documentation and readme with the different inputs ava…
authored
56 h2. The Available Inputs
57
58 * :select (a select menu for belongs_to associations) - default for columns ending in '_id'
59 * :radio (a set of radio inputs for belongs_to associations) - alternative for columns ending in '_id'
60 * :password (a password input) - default for :string column types with 'password' in the method name
61 * :text (a textarea) - default for :text column types
62 * :date (a date select) - default for :date column types
63 * :datetime (a date and time select) - default for :datetime and :timestamp column types
64 * :time (a time select) - default for :time column types
65 * :boolean (a checkbox) - default for :boolean column types
2007904 @justinfrench added a new boolean_select input, for boolean fields that work better…
authored
66 * :boolean_select (a yes/no select box)
5a39443 @justinfrench bulking up the documentation and readme with the different inputs ava…
authored
67 * :string (a text field) - default for :string column types
68 * :numeric (a text field, like string) - default for :integer, :float and :decimal column types
945b76c @sprsquish Add detection for Paperclip and AttachmentFu attributes.
sprsquish authored
69 * :file (a file field) - default for paperclip or attachment_fu attributes
5a39443 @justinfrench bulking up the documentation and readme with the different inputs ava…
authored
70
827d9ac @justinfrench typo fix
authored
71 The documentation is pretty good for each of these (what it does, what the output is, etc) so go check it out.
5a39443 @justinfrench bulking up the documentation and readme with the different inputs ava…
authored
72
73
74 h3. One day...
75
76 * calendars and other more humanized date/time selections
77 * flash-based multi-file selection
78 * an interface for tagging and other has_many_through style associations
79
dc3ace9 @justinfrench more on the README
authored
80 In the meantime, there's nothing stopping you from mixing some old fashioned HTML and ERB for custom widgets in with the Formtastic DLS stuff in your views, and I'd love to hear what others are finding a need for.
5a39443 @justinfrench bulking up the documentation and readme with the different inputs ava…
authored
81
82 h3. Fields without database columns
83
84 Formtastic is pretty tightly coupled to ActiveRecord database columns, but it will at least _attempt_ to play nicely with your models other methods (like a virtual column 'full_name' which is split into first_name and last_name in a before save callback), and I'd like this to continue and improve.
85
86
87 h2. Configuration
88
89 If you wish, put something like this in config/initializers/formtastic_config.rb:
90
91 <pre>
ee26f18 @sprsquish Remove JustinFrench namespace and add deprecation message for anyone …
sprsquish authored
92 Formtastic::SemanticFormBuilder.all_fields_required_by_default = false
93 Formtastic::SemanticFormBuilder.required_string = "(required)"
94 Formtastic::SemanticFormBuilder.optional_string = "(optional)"
5d072fa @andypearson Updating README to include a note about configuring inline errors
andypearson authored
95
96 # Set the way inline errors will be displayed. Valid options are :sentence, :list and :none
ee26f18 @sprsquish Remove JustinFrench namespace and add deprecation message for anyone …
sprsquish authored
97 Formtastic::SemanticFormBuilder.inline_errors = :sentence
282b28c @sprsquish Add I18n support
sprsquish authored
98
99 # Set the method called on label text to determine its format (:titleize, :humanize, :to_s, etc)
100 Formtastic::SemanticFormBuilder.label_str_method = :titleize
30cfc86 @sprsquish Add Formtastic::SemanticFormBuilder.collection_label_methods to allow…
sprsquish authored
101
102 # Set the possible methods to be called for label text
103 # Whichever method is found first on the object will be used to set the text of the label for that object
104 # So in the following object:
105 # class User
106 # def full_name; end
107 # def title; end
108 # end
109 # The #full_name method will determine what shows up in the label
110 Formtastic::SemanticFormBuilder.collection_label_methods = %w[to_label display_name full_name name title username login value to_s]
5a39443 @justinfrench bulking up the documentation and readme with the different inputs ava…
authored
111 </pre>
112
113
114
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
115 h2. Status
dcf8beb Initial Commit
Justin French authored
116
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand vers…
authored
117 *THIS IS DEFINITELY NOT PRODUCTION-READY. THINGS ARE GOING TO CHANGE A BIT.*
dcf8beb Initial Commit
Justin French authored
118
f33efe3 @justinfrench updating the readme a little, especially now that the specs crash for…
authored
119 It's incredibly opinionated, incomplete, a work in progress, messy around the edges, messy in the middle too, tightly coupled to the database, tightly coupled to "my way" of doing things and has an incomplete (but fast-growing) test suite, but I hope you try it and offer some suggestions and improvements any way.
dcf8beb Initial Commit
Justin French authored
120
121
25d0c7a @justinfrench fleshed out a 'roadmap to 1.0' in the README
authored
122 h2. Roadmap to 1.0
dcf8beb Initial Commit
Justin French authored
123
c7ce9a2 @justinfrench It's now possible to customize the options in :select and :radio belo…
authored
124 * there's a few of TODOs left in the code
25d0c7a @justinfrench fleshed out a 'roadmap to 1.0' in the README
authored
125 * improve the generated sample stylesheets
126 * take a look at a DSL for the validation errors heading and messages typically placed at the top of a form
ee26f18 @sprsquish Remove JustinFrench namespace and add deprecation message for anyone …
sprsquish authored
127 * maybe get rid of the module namespace
dcf8beb Initial Commit
Justin French authored
128
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
129 h2. Usage
dcf8beb Initial Commit
Justin French authored
130
131 The smallest example:
132
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
133 <pre>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
134 <% semantic_form_for @post do |form| %>
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand vers…
authored
135 <% form.inputs do %>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
136 <%= form.input :title %>
137 <%= form.input :body %>
138 <%= form.input :section_id, :as => :radio %>
139 <% end %>
140 <% form.buttons do %>
141 <%= form.commit_button %>
7e3874a @justinfrench trying to fix README formatting of <'s at the start of lines
authored
142 <% end %>
dcf8beb Initial Commit
Justin French authored
143 <% end %>
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
144 </pre>
dcf8beb Initial Commit
Justin French authored
145
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
146 Yes, it'll even handle belongs_to associations, rendering a radio list or select box with the right set of choices! The output is something like:
dcf8beb Initial Commit
Justin French authored
147
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
148 <pre>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
149 <form action="/posts" class="formtastic new_post" id="new_post" method="post">
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
150 <fieldset class="inputs">
151 <ol>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
152 <li class="string required" id="post_title_input">
153 <label for="post_title">Title<abbr title="required">*</abbr></label>
154 <input id="post_title" maxlength="255" name="post[title]" size="50" type="text" />
155 </li>
156 <li class="text optional" id="post_body_input">
157 <label for="post_body">Body</label>
158 <textarea cols="40" id="post_body" name="post[body]" rows="20"></textarea>
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
159 </li>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
160 <li class="radio required" id="post_author_id_input">
161 <fieldset>
162 <legend><span>Author<abbr title="required">*</abbr></span></legend>
163 <ol>
164 <li>
165 <label for="post_author_id_37">
166 <input id="post_author_id_37" name="post[author_id]" type="radio" value="37" />
167 Fred Smith
168 </label>
169 </li>
170 <li>
171 <label for="post_author_id_42">
172 <input id="post_author_id_42" name="post[author_id]" type="radio" value="42" />
173 Bob Rock
174 </label>
175 </li>
176 </ol>
177 </fieldset>
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
178 </li>
179 </ol>
dcf8beb Initial Commit
Justin French authored
180 </fieldset>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
181 <fieldset class="buttons">
182 <ol>
183 <li class="commit">
184 <input name="commit" type="submit" value="Create Post" />
185 </li>
186 </ol>
187 </fieldset>
188 </form></pre>
0c71a46 mentioned to_label in the README
Justin French authored
189
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand vers…
authored
190 If you're happy to accept the default input types and labels, there's a shorthand version too:
191
192 <pre>
193 <% semantic_form_for @user do |form| %>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
194 <%= form.inputs :title, :body, :section_id, :created_at %>
195 <%= form.buttons :commit %>
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand vers…
authored
196 <% end %>
197 </pre>
198
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
199 You don't even have to specify the field list (Formtastic will simply render and input for each column in the database table) or button list (usually you only need one commit button to create/save):
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand vers…
authored
200
201 <pre>
202 <% semantic_form_for @user do |form| %>
203 <%= form.inputs %>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
204 <%= form.buttons %>
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand vers…
authored
205 <% end %>
206 </pre>
207
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
208 Pretty soon we won't have to write any code at all ;)
209
085e22f @sprsquish Add support for nested forms (http://ryandaigle.com/articles/2009/2/1…
sprsquish authored
210 h2. Nested forms (Rails 2.3+)
211
212 Nested forms are supported:
213
214 <pre>
215 <% semantic_form_for @post do |post| %>
216 <%= post.semantic_fields_for :author do |author| %>
217 <%= author.inputs %>
218 <%= end %>
219 <%= post.buttons %>
220 <% end %>
221 </pre>
282b28c @sprsquish Add I18n support
sprsquish authored
222
223 h2. Internationalization (I18n)
224
225 Supports I18n! ActiveRecord object names and attributes are, by default, taken from calling @object.human_name and @object.human_attribute_name(attr) respectively. There are a few words specific to Formtastic that can be translated.
226
227 Here is an example locale file:
228
229 <pre>
230 en:
231 formtastic:
232 yes: 'Yes'
233 no: 'No'
234 create: 'Create'
235 save: 'Save'
236 year: 'Year'
237 month: 'Month'
238 day: 'Day'
239 hour: 'Hour'
240 minute: 'Minute'
241 second: 'Second'
242 </pre>
085e22f @sprsquish Add support for nested forms (http://ryandaigle.com/articles/2009/2/1…
sprsquish authored
243
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
244 h2. Extending Formtastic
245
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namesp…
markmansour authored
246 Adding functionality to Formtastic can be done by extending SemanticFormBuilder and configuring formtastic's builder.
247
248 To create a new form method that displayed a star rating define the new Formtastic form builder by subclassing SemanticFormBuilder:
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
249
250 <pre>
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namesp…
markmansour authored
251 # RAILS_ROOT/lib/rating_semantic_form_builder.rb
ee26f18 @sprsquish Remove JustinFrench namespace and add deprecation message for anyone …
sprsquish authored
252 class RatingSemanticFormBuilder < Formtastic::SemanticFormBuilder
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namesp…
markmansour authored
253 # new method to be added allowing full control over the label and value
254 def rating(stars, options = {})
255 options[:label] ||= 'rating'
256 content = input_label(options[:label], options)
257 content += @template.content_tag(:span, '*' * stars.to_i, :id => "#{@object_name}_#{options[:label]}")
258 @template.content_tag(:li, content)
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
259 end
260 end
261 </pre>
262
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namesp…
markmansour authored
263 Set Formtastic's builder to your newly defined RatingSemanticFormBuilder
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
264 <pre>
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namesp…
markmansour authored
265 # RAILS_ROOT/config/initializers/override_formtastic_builder.rb
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
266
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namesp…
markmansour authored
267 require 'rating_semantic_form_builder.rb'
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
268
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namesp…
markmansour authored
269 # set the formtastic builder to a customized version of the formtastic builder
ee26f18 @sprsquish Remove JustinFrench namespace and add deprecation message for anyone …
sprsquish authored
270 Formtastic::SemanticFormHelper.builder = RatingSemanticFormBuilder
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namesp…
markmansour authored
271 </pre>
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
272
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namesp…
markmansour authored
273 Use your newly created formtastic method
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
274 <pre>
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namesp…
markmansour authored
275 <% semantic_form_for Project.new do |form| %>
276 <% form.input_field_set :name => "ratings" do %>
277 <%= form.rating 5 %>
278 <%= form.rating 11, :label => 'awesomeness (out of 10)' %>
279 <% end %>
280 <% end %>
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_buil…
markmansour authored
281 </pre>
0c71a46 mentioned to_label in the README
Justin French authored
282
283 h2. Conventions & Prerequisites
284
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand vers…
authored
285 In a few places (like radio or select widgets for belongs_to associations) Formtastic expects your ActiveRecord instances to respond to the <code>to_label</code> or <code>to_s</code> method (returning a String). You can easily add this to your models: For example, a User object might want to return the user's first name, last name and login:
0c71a46 mentioned to_label in the README
Justin French authored
286
287 <pre>
288 class User < ActiveRecord::Base
289 #...
290 def to_label
291 "#{first_name} #{last_name} (#{login})"
292 end
293 end
294 </pre>
295
296
b03d5b7 @justinfrench Cleaned up the code and specs around the validation_reflection, inclu…
authored
297 h2. Dependencies
298
49485da @justinfrench updated the dependencies in the README to cover the test suite
authored
299 There are none, but...
300
301 * if you have the "ValidationReflection":http://github.com/redinger/validation_reflection plugin is installed, you won't have to specify the :required option (it checks the validations on the model instead)
302 * rspec, rspec_hpricot_matchers and rcov gems (plus any of their own dependencies) are required for the test suite
b03d5b7 @justinfrench Cleaned up the code and specs around the validation_reflection, inclu…
authored
303
0c71a46 mentioned to_label in the README
Justin French authored
304
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
305 h2. What about Stylesheets?
dcf8beb Initial Commit
Justin French authored
306
9525ac2 updated the README a little to walk through stylesheet usage
Justin French authored
307 A proof-of-concept (very much a work-in-progress) stylesheet is provided which you can include in your layout. Customisation is best achieved by overriding these styles in an additional stylesheet so that the formtastic styles can be updated without clobbering your changes.
dcf8beb Initial Commit
Justin French authored
308
ef95eff @justinfrench updated README to refelct the generated formtastic_changes.css
authored
309 1. Use the generator to copy the formtastic.css and formtastic_changes.css into your public directory
4f147ea added some stylsheet usage help to the README and to formtastic.css, …
Justin French authored
310
9525ac2 updated the README a little to walk through stylesheet usage
Justin French authored
311 <pre>
4f147ea added some stylsheet usage help to the README and to formtastic.css, …
Justin French authored
312 ./script/generate formtastic_stylesheets
9525ac2 updated the README a little to walk through stylesheet usage
Justin French authored
313 </pre>
314
519b640 @justinfrench no need for yahoo's reset.css any more... doing my own resets
authored
315 2. Add both formtastic.css and formtastic_changes.css to your layout:
4f147ea added some stylsheet usage help to the README and to formtastic.css, …
Justin French authored
316
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
317 <pre>
318 <%= stylesheet_link_tag "formtastic" %>
9525ac2 updated the README a little to walk through stylesheet usage
Justin French authored
319 <%= stylesheet_link_tag "formtastic_changes" %>
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
320 </pre>
dcf8beb Initial Commit
Justin French authored
321
9525ac2 updated the README a little to walk through stylesheet usage
Justin French authored
322
323
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
324 h2. Compatibility
dcf8beb Initial Commit
Justin French authored
325
6a3161d @justinfrench updated README to nuke the 2.2.x note
authored
326 I'm only testing Formtastic with the latest Rails 2.2.x stable release.
dcf8beb Initial Commit
Justin French authored
327
328
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
329 h2. But it doesn't do that thing I really need!
dcf8beb Initial Commit
Justin French authored
330
331 Oh noes! It might not ever do it either. We'll see. This is not a silver bullet. I want to make the usual stuff easy, and the unusual stuff possible. That might mean that some of the inputs on your form still have to be hard-coded, but some is better than all, right?
332
333 I really hope the plugin will soon be clean and extensible enough to invite others to contribute more complex input types (calendars, etc) to the core.
334
335
336
ba3ce05 @justinfrench updated the README a little with contributors and some other busy work
authored
337 h2. Contributors
338
5a39443 @justinfrench bulking up the documentation and readme with the different inputs ava…
authored
339 * "Justin French":http://justinfrench.com
340 * "Xavier Shay":http://rhnh.net
0c50ce3 @justinfrench Updated contributors list in the README. Thanks Everyone\!
authored
341 * "Bin Dong":http://github.com/dongbin
dc3ace9 @justinfrench more on the README
authored
342 * "Ben Hamill":http://blog.benhamill.com/
15ff964 @justinfrench Added Pat and negonicrac to contributors.
authored
343 * "Pat Allan":http://github.com/freelancing-god
344 * "negonicrac":http://github.com/negonicrac
0c50ce3 @justinfrench Updated contributors list in the README. Thanks Everyone\!
authored
345 * "Andy Pearson":http://github.com/andypearson
1587c56 @justinfrench Vanity commit for Mark ;)
authored
346 * "Mark Mansour":http://stateofflux.com
0c50ce3 @justinfrench Updated contributors list in the README. Thanks Everyone\!
authored
347 * "Tien Dung":http://github.com/tiendung
ba3ce05 @justinfrench updated the README a little with contributors and some other busy work
authored
348
349
350 h2. Project Info
351
dc3ace9 @justinfrench more on the README
authored
352 Formtastic is hosted on Github: http://github.com/justinfrench/formtastic/, where your contributions, forkings, comments and feedback are greatly welcomed.
ba3ce05 @justinfrench updated the README a little with contributors and some other busy work
authored
353
354
25d0c7a @justinfrench fleshed out a 'roadmap to 1.0' in the README
authored
355 Copyright (c) 2007-2008 Justin French, released under the MIT license.
Something went wrong with that request. Please try again.