Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 350 lines (251 sloc) 13.079 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
2d4a72b @justinfrench big update to the README
authored
7 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_builder...
markmansour authored
11
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand version...
authored
12 <% form.inputs :name => "Basic" do %>
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_builder...
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 version...
authored
21 <% form.inputs :name => "Advanced" do %>
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_builder...
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_builder...
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_builder...
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 availa...
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 wi...
authored
66 * :boolean_select (a yes/no select box)
5a39443 @justinfrench bulking up the documentation and readme with the different inputs availa...
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 availa...
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 availa...
authored
72
73
2d4a72b @justinfrench big update to the README
authored
74 h3. Fields without database columns and non-ActiveRecord objects
5a39443 @justinfrench bulking up the documentation and readme with the different inputs availa...
authored
75
76 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.
77
78
79 h2. Configuration
80
81 If you wish, put something like this in config/initializers/formtastic_config.rb:
82
83 <pre>
2d4a72b @justinfrench big update to the README
authored
84 # Should all fields be considered "required" by default
85 # Defaults to true, see ValidationReflection notes below
ee26f18 @sprsquish Remove JustinFrench namespace and add deprecation message for anyone sti...
sprsquish authored
86 Formtastic::SemanticFormBuilder.all_fields_required_by_default = false
2d4a72b @justinfrench big update to the README
authored
87
88 # Set the string that will be appended to the labels/fieldsets which are required
89 # Default is '<abbr title="required">*</abbr>'
ee26f18 @sprsquish Remove JustinFrench namespace and add deprecation message for anyone sti...
sprsquish authored
90 Formtastic::SemanticFormBuilder.required_string = "(required)"
2d4a72b @justinfrench big update to the README
authored
91
92 # Set the string that will be appended to the labels/fieldsets which are optional
93 # Defaults to an empty string ("")
ee26f18 @sprsquish Remove JustinFrench namespace and add deprecation message for anyone sti...
sprsquish authored
94 Formtastic::SemanticFormBuilder.optional_string = "(optional)"
5d072fa @andypearson Updating README to include a note about configuring inline errors
andypearson authored
95
2d4a72b @justinfrench big update to the README
authored
96 # Set the way inline errors will be displayed.
d3d53d0 @justinfrench typo fix in README
authored
97 # Defaults to :sentence, valid options are :sentence, :list and :none
2d4a72b @justinfrench big update to the README
authored
98 Formtastic::SemanticFormBuilder.inline_errors = :list
282b28c @sprsquish Add I18n support
sprsquish authored
99
2d4a72b @justinfrench big update to the README
authored
100 # Set the method to call on label text to transform or format it for human-friendly reading
101 # Defaults to :titleize, but you might want :humanize, :to_s, etc
282b28c @sprsquish Add I18n support
sprsquish authored
102 Formtastic::SemanticFormBuilder.label_str_method = :titleize
30cfc86 @sprsquish Add Formtastic::SemanticFormBuilder.collection_label_methods to allow fo...
sprsquish authored
103
2d4a72b @justinfrench big update to the README
authored
104 # Set the array of methods to try calling on parent objects in :select and :radio inputs
105 # for the text inside each @<option>@ tag or alongside each radio @<input>@. The first method
106 # that is found on the object will be used.
107 # Defaults to ["to_label", "display_name", "full_name", "name", "title", "username", "login", "value", "to_s"]
108 Formtastic::SemanticFormBuilder.collection_label_methods = ["title_and_author", "display_name", "login", "to_s"]
5a39443 @justinfrench bulking up the documentation and readme with the different inputs availa...
authored
109 </pre>
110
111
2d4a72b @justinfrench big update to the README
authored
112 h2. ValidationReflection plugin
113
114 If you have the "ValidationReflection":http://github.com/redinger/validation_reflection plugin installed, you won't have to specify the :required option (it checks the validations on the model instead).
115
5a39443 @justinfrench bulking up the documentation and readme with the different inputs availa...
authored
116
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
117 h2. Status
dcf8beb Initial Commit
Justin French authored
118
2d4a72b @justinfrench big update to the README
authored
119 *THIS IS DEFINITELY NOT PRODUCTION-READY. THINGS ARE GOING TO CHANGE A BIT BEFORE WE HIT 1.0.*
dcf8beb Initial Commit
Justin French authored
120
2d4a72b @justinfrench big update to the README
authored
121 It's opinionated, incomplete, a work in progress and a bit rough around the edges stiull, but I hope you try it and offer some suggestions and improvements any way.
122
123 On the plus side, it has a comprehensive spec suite and contributions from at least ten independent developers.
dcf8beb Initial Commit
Justin French authored
124
125
25d0c7a @justinfrench fleshed out a 'roadmap to 1.0' in the README
authored
126 h2. Roadmap to 1.0
dcf8beb Initial Commit
Justin French authored
127
2d4a72b @justinfrench big update to the README
authored
128 "Wishlist":http://wiki.github.com/justinfrench/formtastic/wishlist on the wiki is serving as pretty good documentation for the roadmap to 1.0 and beyond right now, but I'll work on getting a real tracking system or something happening soon.
c5d02e6 @justinfrench link to the wiki for the roadmap to 1.0 in README
authored
129
dcf8beb Initial Commit
Justin French authored
130
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
131 h2. Usage
dcf8beb Initial Commit
Justin French authored
132
133 The smallest example:
134
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
135 <pre>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
136 <% semantic_form_for @post do |form| %>
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand version...
authored
137 <% form.inputs do %>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
138 <%= form.input :title %>
139 <%= form.input :body %>
140 <%= form.input :section_id, :as => :radio %>
141 <% end %>
142 <% form.buttons do %>
143 <%= form.commit_button %>
7e3874a @justinfrench trying to fix README formatting of <'s at the start of lines
authored
144 <% end %>
dcf8beb Initial Commit
Justin French authored
145 <% end %>
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
146 </pre>
dcf8beb Initial Commit
Justin French authored
147
2d4a72b @justinfrench big update to the README
authored
148 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
149
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
150 <pre>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
151 <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
152 <fieldset class="inputs">
153 <ol>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
154 <li class="string required" id="post_title_input">
155 <label for="post_title">Title<abbr title="required">*</abbr></label>
156 <input id="post_title" maxlength="255" name="post[title]" size="50" type="text" />
157 </li>
158 <li class="text optional" id="post_body_input">
159 <label for="post_body">Body</label>
160 <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
161 </li>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
162 <li class="radio required" id="post_author_id_input">
163 <fieldset>
164 <legend><span>Author<abbr title="required">*</abbr></span></legend>
165 <ol>
166 <li>
167 <label for="post_author_id_37">
168 <input id="post_author_id_37" name="post[author_id]" type="radio" value="37" />
169 Fred Smith
170 </label>
171 </li>
172 <li>
173 <label for="post_author_id_42">
174 <input id="post_author_id_42" name="post[author_id]" type="radio" value="42" />
175 Bob Rock
176 </label>
177 </li>
178 </ol>
179 </fieldset>
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
180 </li>
181 </ol>
dcf8beb Initial Commit
Justin French authored
182 </fieldset>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
183 <fieldset class="buttons">
184 <ol>
185 <li class="commit">
186 <input name="commit" type="submit" value="Create Post" />
187 </li>
188 </ol>
189 </fieldset>
190 </form></pre>
0c71a46 mentioned to_label in the README
Justin French authored
191
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand version...
authored
192 If you're happy to accept the default input types and labels, there's a shorthand version too:
193
194 <pre>
195 <% semantic_form_for @user do |form| %>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
196 <%= form.inputs :title, :body, :section_id, :created_at %>
197 <%= form.buttons :commit %>
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand version...
authored
198 <% end %>
199 </pre>
200
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
201 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 version...
authored
202
203 <pre>
204 <% semantic_form_for @user do |form| %>
205 <%= form.inputs %>
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
206 <%= form.buttons %>
0b370ba @justinfrench Renamed input_field_set() to just inputs() and added a shorthand version...
authored
207 <% end %>
208 </pre>
209
92e5fc3 @justinfrench Updates to the README with better examples and output samples.
authored
210 Pretty soon we won't have to write any code at all ;)
211
2d4a72b @justinfrench big update to the README
authored
212
085e22f @sprsquish Add support for nested forms (http://ryandaigle.com/articles/2009/2/1/wh...
sprsquish authored
213 h2. Nested forms (Rails 2.3+)
214
215 Nested forms are supported:
216
217 <pre>
218 <% semantic_form_for @post do |post| %>
219 <%= post.semantic_fields_for :author do |author| %>
220 <%= author.inputs %>
221 <%= end %>
222 <%= post.buttons %>
223 <% end %>
224 </pre>
282b28c @sprsquish Add I18n support
sprsquish authored
225
2d4a72b @justinfrench big update to the README
authored
226
282b28c @sprsquish Add I18n support
sprsquish authored
227 h2. Internationalization (I18n)
228
229 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.
230
231 Here is an example locale file:
232
233 <pre>
2d4a72b @justinfrench big update to the README
authored
234 en:
235 formtastic:
236 yes: 'Yes'
237 no: 'No'
238 create: 'Create'
239 save: 'Save'
240 year: 'Year'
241 month: 'Month'
242 day: 'Day'
243 hour: 'Hour'
244 minute: 'Minute'
245 second: 'Second'
282b28c @sprsquish Add I18n support
sprsquish authored
246 </pre>
085e22f @sprsquish Add support for nested forms (http://ryandaigle.com/articles/2009/2/1/wh...
sprsquish authored
247
2d4a72b @justinfrench big update to the README
authored
248
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_builder...
markmansour authored
249 h2. Extending Formtastic
250
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namespace...
markmansour authored
251 Adding functionality to Formtastic can be done by extending SemanticFormBuilder and configuring formtastic's builder.
252
2d4a72b @justinfrench big update to the README
authored
253 To create a new form method that displayed a star rating define the new builder by subclassing SemanticFormBuilder:
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_builder...
markmansour authored
254
255 <pre>
2d4a72b @justinfrench big update to the README
authored
256 # lib/rating_semantic_form_builder.rb
257 class RatingBuilder < Formtastic::SemanticFormBuilder
258 # new method to be added allowing full control over the label and value
259 def rating(stars, options = {})
260 options[:label] ||= 'rating'
261 content = input_label(options[:label], options)
262 content += @template.content_tag(:span, '*' * stars.to_i, :id => "#{@object_name}_#{options[:label]}")
263 @template.content_tag(:li, content)
264 end
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_builder...
markmansour authored
265 end
266 </pre>
267
2d4a72b @justinfrench big update to the README
authored
268 Set Formtastic's builder to your newly defined RatingBuilder
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_builder...
markmansour authored
269 <pre>
2d4a72b @justinfrench big update to the README
authored
270 # RAILS_ROOT/config/initializers/override_formtastic_builder.rb
271 require 'rating_semantic_form_builder.rb'
272
273 # set the formtastic builder to a customized version of the formtastic builder
274 Formtastic::SemanticFormHelper.builder = RatingBuilder
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namespace...
markmansour authored
275 </pre>
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_builder...
markmansour authored
276
2d4a72b @justinfrench big update to the README
authored
277 Use @semantic_form_for@ just like you would with Formtastic.
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_builder...
markmansour authored
278 <pre>
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namespace...
markmansour authored
279 <% semantic_form_for Project.new do |form| %>
280 <% form.input_field_set :name => "ratings" do %>
281 <%= form.rating 5 %>
282 <%= form.rating 11, :label => 'awesomeness (out of 10)' %>
283 <% end %>
2d4a72b @justinfrench big update to the README
authored
284 <%= form.buttons %>
6ba950e @markmansour created example which doesn't use the JustinFrench::Formtastic namespace...
markmansour authored
285 <% end %>
353618e @markmansour Extending Formtastic can be done by overriding the semantic_form_builder...
markmansour authored
286 </pre>
0c71a46 mentioned to_label in the README
Justin French authored
287
288
b03d5b7 @justinfrench Cleaned up the code and specs around the validation_reflection, includin...
authored
289 h2. Dependencies
290
49485da @justinfrench updated the dependencies in the README to cover the test suite
authored
291 There are none, but...
292
293 * 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)
294 * 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, includin...
authored
295
0c71a46 mentioned to_label in the README
Justin French authored
296
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
297 h2. What about Stylesheets?
dcf8beb Initial Commit
Justin French authored
298
9525ac2 updated the README a little to walk through stylesheet usage
Justin French authored
299 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
300
ef95eff @justinfrench updated README to refelct the generated formtastic_changes.css
authored
301 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, not...
Justin French authored
302
9525ac2 updated the README a little to walk through stylesheet usage
Justin French authored
303 <pre>
4f147ea added some stylsheet usage help to the README and to formtastic.css, not...
Justin French authored
304 ./script/generate formtastic_stylesheets
9525ac2 updated the README a little to walk through stylesheet usage
Justin French authored
305 </pre>
306
519b640 @justinfrench no need for yahoo's reset.css any more... doing my own resets
authored
307 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, not...
Justin French authored
308
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
309 <pre>
310 <%= stylesheet_link_tag "formtastic" %>
9525ac2 updated the README a little to walk through stylesheet usage
Justin French authored
311 <%= stylesheet_link_tag "formtastic_changes" %>
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
312 </pre>
dcf8beb Initial Commit
Justin French authored
313
9525ac2 updated the README a little to walk through stylesheet usage
Justin French authored
314
315
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
316 h2. Compatibility
dcf8beb Initial Commit
Justin French authored
317
2d4a72b @justinfrench big update to the README
authored
318 I'm only testing Formtastic with the latest Rails 2.2.x stable release, and it should be fine under Rails 2.3 as well (including nested forms).
dcf8beb Initial Commit
Justin French authored
319
320
09d957d textilized the README so that it looks pretty pretty on GitHub
Justin French authored
321 h2. But it doesn't do that thing I really need!
dcf8beb Initial Commit
Justin French authored
322
2d4a72b @justinfrench big update to the README
authored
323 It might not ever do it either, there are no silver bullets. 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?
dcf8beb Initial Commit
Justin French authored
324
325
326
2d4a72b @justinfrench big update to the README
authored
327 h2. Many thanks to Formtastic's contributors
ba3ce05 @justinfrench updated the README a little with contributors and some other busy work
authored
328
5a39443 @justinfrench bulking up the documentation and readme with the different inputs availa...
authored
329 * "Justin French":http://justinfrench.com
330 * "Xavier Shay":http://rhnh.net
0c50ce3 @justinfrench Updated contributors list in the README. Thanks Everyone\!
authored
331 * "Bin Dong":http://github.com/dongbin
dc3ace9 @justinfrench more on the README
authored
332 * "Ben Hamill":http://blog.benhamill.com/
15ff964 @justinfrench Added Pat and negonicrac to contributors.
authored
333 * "Pat Allan":http://github.com/freelancing-god
334 * "negonicrac":http://github.com/negonicrac
0c50ce3 @justinfrench Updated contributors list in the README. Thanks Everyone\!
authored
335 * "Andy Pearson":http://github.com/andypearson
1587c56 @justinfrench Vanity commit for Mark ;)
authored
336 * "Mark Mansour":http://stateofflux.com
0c50ce3 @justinfrench Updated contributors list in the README. Thanks Everyone\!
authored
337 * "Tien Dung":http://github.com/tiendung
c8d721e @justinfrench Updated the contributors list
authored
338 * "Sascha Hoellger":http://github.com/mitnal
339 * "Jeff Smick":http://github.com/sprsquish
ba3ce05 @justinfrench updated the README a little with contributors and some other busy work
authored
340
2d4a72b @justinfrench big update to the README
authored
341
ba3ce05 @justinfrench updated the README a little with contributors and some other busy work
authored
342 h2. Project Info
343
dc3ace9 @justinfrench more on the README
authored
344 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
345
324a875 @justinfrench link to the google group from the README
authored
346 There's also a newly created "Formtastic Google Group":http://groups.google.com.au/group/formtastic.
347
ba3ce05 @justinfrench updated the README a little with contributors and some other busy work
authored
348
25d0c7a @justinfrench fleshed out a 'roadmap to 1.0' in the README
authored
349 Copyright (c) 2007-2008 Justin French, released under the MIT license.
Something went wrong with that request. Please try again.