rails g skizmo:form --help
rails generate skizmo:form NAME [options]
[--helpers] # Indicates when to generate helpers# Default: true [--javascript] # Indicates when to generate javascript# Default: true [--select-boxes] # Indicates when to generate select boxes# Default: true
-f, [--force] # Overwrite files that already exist -s, [--skip] # Skip files that already exist -q, [--quiet] # Supress status output -p, [--pretend] # Run but do not make any changes
Generates a form per usual but with fields_for for the has_many and belongs_to associations that are "accepted_nested_attributes". If the fields are not accepted nested attributes, then they are selectable options, multi-select for has_many and single select for belongs_to. 'has_attached_file' will trigger the file_field input and create a multipart form.
rails generate skizmo:form Foo With Foo.rb (model like this): class Foo < ActiveRecord::Base has_many :bars belongs_to :baz has_many :others belongs_to :something accepts_nested_attributes_for :bars accepts_nested_attributes_for :baz has_attached_file :image end This will create: public/javascripts/jquery.add_remove_links.js app/helpers/add_remove_links_helper.rb app/helpers/foo_setup_helper.rb app/views/foos/new.html.erb app/views/foos/edit.html.erb app/views/foos/_form.html.erb app/views/foos/_bar_fields.html.erb app/views/foos/_baz_fields.html.erb
public/javascripts/jquery.add_remove_links.js
app/helpers/add_remove_links_helper.rb
Based on Foo example above.
app/helpers/foo_setup_helper.rb
app/views/foos/new.html.erb
app/views/foos/edit.html.erb
app/views/foos/_form.html.erb
app/views/foos/_bar_fields.html.erb
app/views/foos/_baz_fields.html.erb
moduleFooSetupHelperdefsetup_foo(obj) obj.build_bazifobj.baz.blank?obj.bars.buildifobj.bars.empty?returnobjenddefbuild_select_list(assoc, options={}) name = options[:name] ||"name"scope = options[:scope] ||"all"begin# name and id associationsassoc.to_s.classify.constantize.send(scope).map{|a| [a.send(name), a.id]} rescue# use id for text and valueassoc.to_s.classify.constantize.send(scope).map(&:id) endendend
<h1>New foo</h1> <%= render 'form' %> <%= link_to 'back', :back %>
<h1>Editing foo</h1> <%= render 'form' %> <%= link_to 'back', :back %>
<%= form_for setup_foo(@foo), :html => { :multipart => true } do |f| %>
<% if @foo.errors.any? %>
<div id="errorExplanation">
<h2><%= pluralize(@foo.errors.count, "error") %> prohibited this foo from being saved:</h2>
<ul>
<% @foo.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :description %>
<%= f.text_area :description %>
</div>
<div class="field">
<%= f.label :image %>
<%= f.file_field :image %>
</div>
<div class="field">
<%= f.label :other_ids, "Others" %>
<%= f.select :other_ids, build_select_list(:others), {:prompt => "Please select"}, {:multiple => true, :size => 4} %>
</div>
<div class="field">
<%= f.label :something_id, "Something" %>
<%= f.select :something_id, build_select_list(:something), {:prompt => "Please select one"} %>
</div>
<%= f.fields_for :baz do |nf| %>
<%= render 'baz_fields', :f => nf %>
<% end %>
<%= f.fields_for :bars do |nf| %>
<%= render 'bar_fields', :f => nf %>
<% end %>
<%= link_to_add_fields "Add bar", f, :bars %>
<%= f.submit "Save" %>
<% end %>
<%= content_for :head do %>
<%= javascript_include_tag 'jquery.add_remove_links.js' %>
<% end %><div class="fields"> <div class="field"> <%= f.label :name %> <%= f.text_field :name %> </div> <div class="field"> <%= f.label :bar %> <%= f.text_field :bar %> </div> <%= link_to_remove_fields "remove", f %> </div>
<div class="fields"> <div class="field"> <%= f.label :name %> <%= f.text_field :name %> </div> <div class="field"> <%= f.label :image %> <%= f.file_field :image %> </div> </div>
I’m getting this error: “undefined method ‘setup_something’ for …”:
Make sure the generated helper is being loaded - restart your rails server.
I want haml templates instead of erb:
Done - just include this gem github.com/indirect/haml-rails
Only does single level nesting at this point. For example, if the Bar or Baz class had accepts_nested_attributes_for :thing, it would not generate those partials and form elements. Yet. This is the only thing on my TODO list before I’d call it a solid 1.0.0.
You need to use yield :head somewhere in your layout to take advantage of the jQuery that is loaded in a content_for :head to supply add and remove jQuery.
Check out the latest master to make sure the feature hasn’t been implemented or the bug hasn’t been fixed yet
Check out the issue tracker to make sure someone already hasn’t requested it and/or contributed it
Fork the project
Start a feature/bugfix branch
Commit and push until you are happy with your contribution
Make sure to add tests for it. This is important so I don’t break it in a future version unintentionally.
Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
Copyright © 2011 Pullmonkey. See LICENSE.txt for further details.