public Method

ActiveRecordHelper.form(record_name, options = {}) { |contents if block_given?| ... }

Returns an entire form with all needed input tags for a specified Active Record object. For example, let’s say you have a table model Post with attributes named title of type VARCHAR and body of type TEXT:

form("post")

That line would yield a form like the following:

<form action="/post/create" method="post">
  <p>
    <label for="post_title">Title</label><br />
    <input name="post[title]" size="30" type="text" value="Hello World" />
  </p>
  <p>
    <label for="post_body">Body</label><br />
    <textarea name="post[body]" rows="20" cols="40">
    </textarea>
  </p>
  <input type="submit" value="Create" />
</form>

It’s possible to specialize the form builder by using a different action name and by supplying another block renderer. For example, let’s say you have a model Entry with an attribute message of type VARCHAR:

form("entry", :action => "sign", :input_block =>
     Proc.new { |record, column| "#{column.human_name}: #{input(record, column.name)}<br />" }) =>

  <form action="/post/sign" method="post">
    Message:
    <input name="post[title]" size="30" type="text" value="Hello World" /><br />
    <input type="submit" value="Sign" />
  </form>

It’s also possible to add additional content to the form by giving it a block, such as:

form("entry", :action => "sign") do |form|
  form << content_tag("b", "Department")
  form << collection_select("department", "id", @departments, "id", "name")
end

The following options are available:

  • action - the action used when submitting the form (default: create if a new record, otherwise update)
  • input_block - specialize the output using a different block, see above
  • method - the method used when submitting the form (default: post)
  • multipart - whether to change the enctype of the form to multipart/form-date, used when uploading a file (default: false)
  • submit_value - the text of the submit button (default: Create if a new record, otherwise Update)

Source Code

# File action_view/helpers/active_record_helper.rb, line 67
def form(record_name, options = {})
  record = instance_variable_get("@#{record_name}")

  options = options.symbolize_keys
  options[:action] ||= record.new_record? ? "create" : "update"
  action = url_for(:action => options[:action], :id => record)

  submit_value = options[:submit_value] || options[:action].gsub(/[^\w]/, '').capitalize

  contents = form_tag({:action => action}, :method =>(options[:method] || 'post'), :enctype => options[:multipart] ? 'multipart/form-data': nil)
  contents << hidden_field(record_name, :id) unless record.new_record?
  contents << all_input_tags(record, record_name, options)
  yield contents if block_given?
  contents << submit_tag(submit_value)
  contents << '</form>'
end
Comments

Have your say
Please use Textile formatting (click here for a cheat sheet). Use <code/> and <pre/> for code samples.
Click here to login with OpenID to to post comments.