Ruby/Rails/method] form helper & render fr_code

fr. http://www.railsbrain.com

구형 start_form_tag 에서 form_for 와 render 로...

책 "Ruby on Rails :Up and Running" 에는 다음과 같은 코드가 나온다.

<%= start_form_tag :action => 'update', :id => @photo %>
  <%= render :partial => 'form' %>
  <%= submit_tag 'Edit' %>
<%= end_form_tag %>

현재 Rails 2 에서는 start_form_tag 를 사용하지 않기 때문에, form_for 로 바꿔보겠다.

<% form_for :photo, :url => {:action => 'update'} do |f| %>
# 중략
<% end %>

중요한 변경은, model 에 해당하는 매개변수와 do 구문 지정이다. 이에 대한 form_for 예제와 아울러 form_tag 예제를 함께 railsbrain 의 API 문서에서 옮겨본다.

  1. form_for (record_or_name_or_array, *args, &proc)
     <% form_for @offer do |f| %>
       <%= f.label :version, 'Version' %>
       <%= f.text_field :version %>
    <% end %>
  2. form_tag (url_for_options = {}, options = {}, *parameters_for_url, &block)
    form_tag('/posts') ☞ <form action="/posts" method="post">
    form_tag('/posts/1', :method => :put) ☞ <form action="/posts/1" method="put">
    form_tag('/upload', :multipart => true)
      ☞ <form action="/upload" method="post" enctype="multipart/form-data">
    <% form_tag '/posts' do -%>
       <div><%= submit_tag 'Save' %></div>
    <% end -%>
      ☞ <form action="/posts" method="post"><div><input type="submit" name="submit"
          value="Save" /></div></form>

유심히 살펴보면 알 수 있겠지만, start_form_tag 에서는 model 지정이 없기 때문에 실제 필드를 가져올 때, model 을 지정하게 된다. 하지만, form_for 를 사용하면 render 메소드에 :locals 를 통해 local 변수로 다음과 같이 f 를 넘기면 된다.

<%= render :partial => 'form', :locals => {:f => f} %>

railsbrain 의 rendering partial 도 옮겨본다.

  • Rendering Partials
    render ( options = nil, extra_options = {}, &block ) 
  1. with a local variable
    render :partial => "person", :locals => {:name => "david"}
  2. with a collection, rendering 'app/views/shared/_note.r(html|xml)'
    render :partial => "shared/note", :collection => @new_notes
  3. with a status code of 500
    render :partial => "broken", :status => 500

rails 1.x 의 구형 code 와 새로 작성된 rails 2 code 를 비교하며 마친다.

# File : edit.rhtml
<%= start_form_tag :action => 'update', :id => @photo %>
  <%= render :partial => 'form' %>
  <%= submit_tag 'Edit' %>
<%= end_form_tag %> 

# File : _form.rhtml
<%= error_messages_for 'photo' %>
<!--[form:photo]-->
<p><label for="photo_filename">Filename</label><br/>
<%= text_field 'photo', 'filename'  %></p>
<!--[eoform:photo]--> 


# File : edit.rhtml ver. rails2
<% form_for :photo, :url => { :action => 'update', :id => @photo } do |f| %>
  <%= render :partial => 'form', :locals => { :f => f } %>
  <%= submit_tag 'Edit' %>
<% end %> 

# File : _form.rhtml ver. rails2
<%= error_messages_for 'photo' %>
<!--[form:photo]-->
<p><label for="photo_filename">Filename</label><br/>
<%= f.text_field('filename') %></p>
<!--[eoform:photo]-->

끝.