# 1. Form helper is used to generate form in view <% form_tag({:action => 'update', :id => @user}) do %> <%= text_field 'user', 'email' %> <% end %> # The generated form HTML <form action="/admin/users/update/1" method="post"> <input id="user_email" name="user[email]" /> </form>
# The submitted form data is in the params hash params = {:user => {:email => "joe@user.com"}} # The form data is passed to an ActiveRecord model @user = User.find(params[:id]) @user.update_attributes(params[:user])
<% form_for(@post) do |f| %> <%= f.error_messages %> <%= f.label :header %> <%= f.text_field :header %><br /> <%= f.label :body %> <%= f.text_area :body %><br /> <%= f.submit "Create" %> <% end %>
<% form_for :user, @admin_user, :url => {:action => 'save'}, :html => {:class => 'admin_form', :multipart => true} do |f| -%> <%= f.error_messages %> <%= f.text_field :email %><br/> <%= text_area :user, 'bio' %><br/> <%= submit_tag 'Sign up' %><br/> <% end -%>
<% form_for @person, :url => { :action => "update" } do |person_form| %> First name: <%= person_form.text_field :first_name %> Last name : <%= person_form.text_field :last_name %> <% fields_for @person.permission do |permission_fields| %> Admin? : <%= permission_fields.check_box :admin %> <% end %> <% end %>
def create @company = Company.new(params[:company]) @product = Product.new(params[:product]) Company.transaction do @company.save! @product.save! redirect_to :action => :show, :id => @company end rescue ActiveRecord::RecordInvalid => e @product.valid? # Force validation as it may not have been validated render :action => :new end
class Person < ActiveRecord::Base has_many :children, :class_name => 'Person' accepts_nested_attributes_for :children # Available as of Rails 2.3 end <% form_for @person do |person_form| %> <% person_form.fields_for :children do |child_form| %> <%= child_form.text_field :name %> <% unless child_form.object.new_record? %> <%= child_form.checkbox '_delete' %> <%= child_form.label '_delete', 'Remove' %> <% end %> <% end %> <%= submit_tag %> <% end %>
fields_for :permission, @person.permission do |fields| ... text_field("post", "title", "size" => 20) password_field hidden_field file_field text_area("post", "body", "cols" => 20, "rows" => 40) check_box("post", "validated") # => 0/1 booleans radio_button("post", "category", "rails")
select_tag(:gender, options_for_select(['Male', 'Female'])) select_tag(:gender, options_for_select([['Male', 'm'], ['Female', 'f']])) f.select(:person_id, Person.all.map {|p| [ p.name, p.id ] }) f.collection_select(:person_id, Person.all, :id, :name) f.time_zone_select(:time_zone, TimeZone.us_zones, :default => "Pacific Time (US & Canada)")
distance_of_time_in_words(from_time, to_time) time_ago_in_words(from_time) f.date_select(:written_on, :start_year => 1995, :use_month_numbers => true, :discard_day => true, :include_blank => true) f.datetime_select(:written_on)
class LabelFormBuilder < ActionView::Helpers::FormBuilder helpers = field_helpers + %w{date_select datetime_select time_select} + %w{collection_select select country_select time_zone_select} - %w{hidden_field label fields_for} # Don't decorate these helpers.each do |name| define_method(name) do |field, *args| options = args.last.is_a?(Hash) ? args.pop : {} label = label(field, options[:label], :class => options[:label_clas]) @template.content_tag(:p, label +'<br/>' + super) #wrap with a paragraph end end end ActionView::Base.default_form_builder = LabelFormBuilder
# Labels and line breaks and paragraphs are generated automatically <% form_for(@user, :builder => LabelFormBuilder) do |f| %> <%= f.error_messages %> <%= f.text_field :name %> <%= f.text_field :address %> <%= f.text_area :comment %> <%= f.check_box :check %> <%= f.submit "Update" %> <% end %>
The easiest way to upload files is to use a plugin such as Paperclip or Attachment Fu
class User < ActiveRecord::Base has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" } end <% form_for :user, :html => { :multipart => true } do |form| %> <%= form.file_field :avatar %> <% end %>
# Style #errorExplanation and .fieldWithErrors in your CSS file # Default markup for form fields with errors: ActionView::Base.field_error_proc = Proc.new do |html_tag, instance| "<div class=\"fieldWithErrors\">#{html_tag}</div>" end # You may turn off inline form error messages if they mess up your form layouts config.action_view.field_error_proc = Proc.new{ |html_tag, instance| html_tag }