SlideShare a Scribd company logo
Ror lab. season 2
   - the 14th round -



  Action View
Form Helpers -2
    January 12th, 2013

     Hyoseong Choi
Special Select
• time_zone_select
  : time_zone_options_for_select
• country_select
  : isolated to country_select plugin
• select_date : barebones helper
• date_select : model object helper
Time Zones
time_zone_select
                                                      model select
                                          attribute
                 <%= f.time_zone_select :time_zone,
priority_zones




                 [ ActiveSupport::TimeZone['Seoul'],
                 ActiveSupport::TimeZone['Tokyo'],ActiveSupport::TimeZ
                 one['Beijing'] ], :default => "Seoul" %>
time_zone_options_for_select
                                      bare-bones select

                      attribute
  <%= form_tag do %>                  selected
    <%= select_tag :time_zone,
          time_zone_options_for_select(nil,
              [




                                                     priority_zones
                ActiveSupport::TimeZone['Seoul'],
                ActiveSupport::TimeZone['Tokyo'],
                ActiveSupport::TimeZone['Beijing']
              ]
         ),
         :default => "Seoul" %>
  <% end %>
country_select
   • gem ‘country_select’
 <%= form_for(@person) do |f| %>
   <div class="field">
     <%= f.label :country %><br />
     <%= f.country_select :country,
             ["Korea, Republic of"] %>
   </div>
                           priority_countries
   <div class="actions">
     <%= f.submit %>
   </div>
 <% end %>




https://github.com/rails/country_select/blob/master/
lib/country_select.rb
select_date
<%= select_date Date.today, :prefix => :start_date %>




<select id="start_date_year"
        name="start_date[year]"> ... </select>
<select id="start_date_month"
        name="start_date[month]"> ... </select>
<select id="start_date_day"
        name="start_date[day]"> ... </select>




Date.civil(params[:start_date][:year].to_i,
params[:start_date][:month].to_i, params[:start_date]
[:day].to_i)
Individual Selects
• select_year
• select_month
• select_day      :prefix defaults to “date”
• select_hour
• select_minute
• select_second
cf. select_date
date_select
<%= date_select :person, :birth_date %>




<select id="person_birth_date_1i"
        name="person[birth_date(1i)]"> ... </select>
<select id="person_birth_date_2i"
        name="person[birth_date(2i)]"> ... </select>
<select id="person_birth_date_3i"
        name="person[birth_date(3i)]"> ... </select>




{:person => {'birth_date(1i)' => '2008',
'birth_date(2i)' => '11', 'birth_date(3i)' => '22'}}
Uploading Files
params[:picture]
 <%= form_tag({:action => :upload}, :multipart =>
 true) do %>
   <%= file_field_tag 'picture' %>
 <% end %>
  
 <%= form_for @person, :multipart => true do |f| %>
   <%= f.file_field :picture %>
 <% end %>

params[:person][:picture]
Since Rails 3.1, it automatically sets the multipart/
form-data with file_field in the form_for
What gets
           uploaded
def upload
  uploaded_io = params[:person][:picture]
  uploaded_io
  File.open(Rails.root.join('public', 'uploads',
uploaded_io.original_filename), 'w') do |file|
    file.write(uploaded_io.read)
  end                             wb
end




an instance of a subclass of IO
   • original_filename
   • content_type : MIME type
UploadedFile
               CLASS ActionDispatch::Http::UploadedFile




"uploaded_file"=>
#<ActionDispatch::Http::UploadedFile:0x007fd288c8fed0
  @original_filename="korean_flag.png",
  @content_type="image/png",
  @headers="Content-Disposition: form-data; name="person[uploaded]";
filename="korean_flag.png"rnContent-Type: image/pngrn",
  @tempfile=
    #<File:/var/folders/rv/q26ztr693k5_58wbggd_jl300000gn/T/
RackMultipart20130107-90570-18x3nfy>
>
Upload Gems
• System Requirement : ImageMagick
• CarrierWave,
 • more flexiable than Paperclip
 • Rmagick gem, required!
• Paperclip
Ajaxing Upload

• “remotipart” gem
  : AJAX style file uploads with jQuery

  https://github.com/leppert/remotipart
Customizing Form
            Builders                                                                   Pro



  using
 helper       <%= form_for @person do |f| %>
 method         <%= text_field_with_label f, :first_name %>
              <% end %>

    or
                <%= form_for @person, :builder => LabellingFormBuilder do |
                f| %>
   using
                  <%= f.text_field :first_name %>
subclassing     <% end %>



                class LabellingFormBuilder <
                ActionView::Helpers::FormBuilder
                  def text_field(attribute, options={})
                    label(attribute) + super
                  end
                end
                                         app/form_builders/labelling_form_builder.rb
Simple_form



•   https://github.com/plataformatec/simple_form
•   with Twitter Boostrap
•   with Foundation 3
Params Naming
  Client           Server

    Form
for model obj
                params[:person]
 “@person”

   submit
Basic Structures
               Arrays & Hashes

<input id="person_name" name="person[name]"

      type="text" value="Henry"/>


params hash
      {‘person’ => {‘name’ => ‘Henry’}}

params[:person]
       {‘name’ => ‘Henry’}

params[:person][:name]
       ‘Henry’
Nested Hashes
<input id="person_address_city"
      name="person[address][city]"
      type="text" value="New York"/>



params hash
      {'person' => {'address' => {'city' => 'New York'}}}
Duplicated Params
                                 array


 <input name="person[phone_number][]" type="text"/>
 <input name="person[phone_number][]" type="text"/>
 <input name="person[phone_number][]" type="text"/>




params[:person][:phone_number]
array        [
                    ’02-333-1234’,
                    ‘031-323-9898’,
                    ‘062-546-2323’
                ]
hash & array


   Mixed Params
   hash nth-nested but array only one-level

<input name="addresses[][line1]" type="text"/>
<input name="addresses[][line2]" type="text"/>
<input name="addresses[][city]" type="text"/>




params[:addresses]             array

                                       hash
      [
          {
              ‘line1’ => ’02-333-1234’,
              ‘line2’ => ‘031-323-9898’,
              ‘city’ => ‘seoul’
          }
      ]
Using Form
             Helpers
<%= form_for @person do |person_form| %>
  <%= person_form.text_field :name %>             address.id
  <% @person.addresses.each do |address| %>
    <%= person_form.fields_for address, :index => address do
|address_form|%>
      <%= address_form.text_field :city %>
    <% end %>
  <% end %>
<% end %>



<form accept-charset="UTF-8" action="/people/1" class="edit_person"
id="edit_person_1" method="post">
  <input id="person_name" name="person[name]" size="30" type="text" />
  <input id="person_address_23_city" name="person[address][23][city]" size="30"
type="text" />
  <input id="person_address_45_city" name="person[address][45][city]" size="30"
type="text" />
</form>
Using Form
         Helpers
params

{
    'person' =>
    {
       'name' =>   'Bob',
       'address'   =>
       {
         '23' =>   {'city' => 'Paris'},
         '45' =>   {'city' => 'London'}
       }
    }
}
Using :index
     <%= fields_for 'person[address][primary]',
     address, :index => address do |address_form| %>
       <%= address_form.text_field :city %>
     <% end %>
or
     <%= fields_for 'person[address][primary][]', address
     do |address_form| %>
       <%= address_form.text_field :city %>
     <% end %>



     <input id="person_address_primary_1_city"
     name="person[address][primary][1][city]" type="text"
     value="bologna" />
Form to External
  Resources - 1
form_tag

 <%= form_tag 'http://farfar.away/
 form', :authenticity_token => 'external_token') do %>
   Form contents
 <% end %>



 <%= form_tag 'http://farfar.away/
                               false
 form', :authenticity_token => false) do %>
   Form contents
 <% end %>                 payment gateway
Form to External
  Resources - 2
form_for

 <%= form_for @invoice, :url =>
 external_url, :authenticity_token => 'external_token'
 do |f|
   Form contents
 <% end %>



 <%= form_for @invoice, :url =>
 external_url, :authenticity_token => false do |f|
   Form contents
 <% end %>
Complex forms
ROR Lab. screencasts
Railscasts by Ryan Bates
•   Complex Forms Part 1 - Episode #73

•   Complex Forms Part II - Episode #74

•   Complex Forms Part III - Episode #75

•   Nested Model Form (revised) - Episode #196
감사합니다.

More Related Content

KEY
JQuery In Rails
PPT
Form demoinplaywithmysql
PDF
Action View Form Helpers - 1, Season 2
PDF
RubyBarCamp “Полезные gems и plugins”
PDF
Therapeutic refactoring
PDF
Jquery In Rails
KEY
Getting started with Rails (4), Season 2
PDF
Be RESTful (Symfony Camp 2008)
JQuery In Rails
Form demoinplaywithmysql
Action View Form Helpers - 1, Season 2
RubyBarCamp “Полезные gems и plugins”
Therapeutic refactoring
Jquery In Rails
Getting started with Rails (4), Season 2
Be RESTful (Symfony Camp 2008)

What's hot (18)

PDF
Юрий Буянов «Squeryl — ORM с человеческим лицом»
PPTX
Custom Signals for Uncoupled Design
DOCX
Borrador del blog
PPT
PDF
Everything you always wanted to know about forms* *but were afraid to ask
PPTX
Lo nuevo de Django 1.7 y 1.8
PPTX
Data Binding: Is It the Next Big Thing?
PDF
Leveraging Symfony2 Forms
PDF
Mashing up JavaScript
KEY
Django quickstart
PDF
HTML5 and CSS3 Refresher
PDF
Laravel 로 배우는 서버사이드 #5
PDF
The Settings API
PDF
Mashing up JavaScript – Advanced Techniques for modern Web Apps
PDF
Advanced Django
PDF
Django - Framework web para perfeccionistas com prazos
DOC
Internet programming lab manual
PDF
Intro programacion funcional
Юрий Буянов «Squeryl — ORM с человеческим лицом»
Custom Signals for Uncoupled Design
Borrador del blog
Everything you always wanted to know about forms* *but were afraid to ask
Lo nuevo de Django 1.7 y 1.8
Data Binding: Is It the Next Big Thing?
Leveraging Symfony2 Forms
Mashing up JavaScript
Django quickstart
HTML5 and CSS3 Refresher
Laravel 로 배우는 서버사이드 #5
The Settings API
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Advanced Django
Django - Framework web para perfeccionistas com prazos
Internet programming lab manual
Intro programacion funcional
Ad

Viewers also liked (7)

PDF
레일스가이드 한글번역 공개프로젝트 RORLabGuides 소개
PDF
Getting Started with Rails (1)
PDF
Active Support Core Extension (2)
KEY
Rails Database Migration, Season 2
KEY
Active Record Association (2), Season 2
PDF
Securing Rails
KEY
ActiveRecord Validations, Season 2
레일스가이드 한글번역 공개프로젝트 RORLabGuides 소개
Getting Started with Rails (1)
Active Support Core Extension (2)
Rails Database Migration, Season 2
Active Record Association (2), Season 2
Securing Rails
ActiveRecord Validations, Season 2
Ad

Similar to Action View Form Helpers - 2, Season 2 (20)

PDF
Form Helpers
PDF
Understanding form helpers
ODP
Rails view chapte 5 - form
PDF
Rails <form> Chronicle
PDF
Rails3 changesets
PDF
WTF Oriented Programming, com Fabio Akita
PDF
RubyOnRails-Cheatsheet-BlaineKendall
PDF
RubyOnRails-Cheatsheet-BlaineKendall
PDF
Beyond MVC
ZIP
Rails 3 (beta) Roundup
PDF
Simplify Your Rails Controllers With a Vengeance
PDF
Rails Intro & Tutorial
ZIP
URUG Ruby on Rails Workshop - Sesssion 5
KEY
More to RoC weibo
PDF
Rails vs Web2py
PDF
[ WrocLoveRb 2012] user perspective testing using ruby
PDF
Do You Need That Validation? Let Me Call You Back About It
PDF
Rails 4.0
PDF
Rails 3 Beginner to Builder 2011 Week 8
PDF
Carlosbrando Rubyonrails21 En
Form Helpers
Understanding form helpers
Rails view chapte 5 - form
Rails <form> Chronicle
Rails3 changesets
WTF Oriented Programming, com Fabio Akita
RubyOnRails-Cheatsheet-BlaineKendall
RubyOnRails-Cheatsheet-BlaineKendall
Beyond MVC
Rails 3 (beta) Roundup
Simplify Your Rails Controllers With a Vengeance
Rails Intro & Tutorial
URUG Ruby on Rails Workshop - Sesssion 5
More to RoC weibo
Rails vs Web2py
[ WrocLoveRb 2012] user perspective testing using ruby
Do You Need That Validation? Let Me Call You Back About It
Rails 4.0
Rails 3 Beginner to Builder 2011 Week 8
Carlosbrando Rubyonrails21 En

More from RORLAB (20)

PDF
Getting Started with Rails (4)
PDF
Getting Started with Rails (3)
PDF
Getting Started with Rails (2)
PDF
Self join in active record association
PDF
Asset Pipeline in Ruby on Rails
PDF
Active Support Core Extension (3)
PDF
Active Support Core Extensions (1)
PDF
Action Controller Overview, Season 2
PDF
Layouts and Rendering in Rails, Season 2
PDF
ActiveRecord Query Interface (2), Season 2
KEY
Active Record Query Interface (1), Season 2
KEY
ActiveRecord Association (1), Season 2
KEY
ActiveRecord Callbacks & Observers, Season 2
KEY
Getting started with Rails (3), Season 2
KEY
Getting started with Rails (2), Season 2
KEY
Getting started with Rails (1), Season 2
KEY
Routing 2, Season 1
KEY
Routing 1, Season 1
KEY
Action Controller Overview, Season 1
KEY
Active Record Form Helpers, Season 1
Getting Started with Rails (4)
Getting Started with Rails (3)
Getting Started with Rails (2)
Self join in active record association
Asset Pipeline in Ruby on Rails
Active Support Core Extension (3)
Active Support Core Extensions (1)
Action Controller Overview, Season 2
Layouts and Rendering in Rails, Season 2
ActiveRecord Query Interface (2), Season 2
Active Record Query Interface (1), Season 2
ActiveRecord Association (1), Season 2
ActiveRecord Callbacks & Observers, Season 2
Getting started with Rails (3), Season 2
Getting started with Rails (2), Season 2
Getting started with Rails (1), Season 2
Routing 2, Season 1
Routing 1, Season 1
Action Controller Overview, Season 1
Active Record Form Helpers, Season 1

Recently uploaded (20)

PPTX
master seminar digital applications in india
PPTX
Microbial diseases, their pathogenesis and prophylaxis
PDF
Classroom Observation Tools for Teachers
PPTX
Introduction to Child Health Nursing – Unit I | Child Health Nursing I | B.Sc...
PPTX
Final Presentation General Medicine 03-08-2024.pptx
PPTX
human mycosis Human fungal infections are called human mycosis..pptx
PDF
TR - Agricultural Crops Production NC III.pdf
PDF
Chapter 2 Heredity, Prenatal Development, and Birth.pdf
PDF
BÀI TẬP BỔ TRỢ 4 KỸ NĂNG TIẾNG ANH 9 GLOBAL SUCCESS - CẢ NĂM - BÁM SÁT FORM Đ...
PDF
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
PDF
Origin of periodic table-Mendeleev’s Periodic-Modern Periodic table
PDF
Mark Klimek Lecture Notes_240423 revision books _173037.pdf
PPTX
Week 4 Term 3 Study Techniques revisited.pptx
PDF
O5-L3 Freight Transport Ops (International) V1.pdf
PDF
Microbial disease of the cardiovascular and lymphatic systems
PDF
Basic Mud Logging Guide for educational purpose
PDF
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
PDF
Abdominal Access Techniques with Prof. Dr. R K Mishra
PDF
Business Ethics Teaching Materials for college
PDF
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
master seminar digital applications in india
Microbial diseases, their pathogenesis and prophylaxis
Classroom Observation Tools for Teachers
Introduction to Child Health Nursing – Unit I | Child Health Nursing I | B.Sc...
Final Presentation General Medicine 03-08-2024.pptx
human mycosis Human fungal infections are called human mycosis..pptx
TR - Agricultural Crops Production NC III.pdf
Chapter 2 Heredity, Prenatal Development, and Birth.pdf
BÀI TẬP BỔ TRỢ 4 KỸ NĂNG TIẾNG ANH 9 GLOBAL SUCCESS - CẢ NĂM - BÁM SÁT FORM Đ...
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
Origin of periodic table-Mendeleev’s Periodic-Modern Periodic table
Mark Klimek Lecture Notes_240423 revision books _173037.pdf
Week 4 Term 3 Study Techniques revisited.pptx
O5-L3 Freight Transport Ops (International) V1.pdf
Microbial disease of the cardiovascular and lymphatic systems
Basic Mud Logging Guide for educational purpose
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
Abdominal Access Techniques with Prof. Dr. R K Mishra
Business Ethics Teaching Materials for college
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx

Action View Form Helpers - 2, Season 2

  • 1. Ror lab. season 2 - the 14th round - Action View Form Helpers -2 January 12th, 2013 Hyoseong Choi
  • 2. Special Select • time_zone_select : time_zone_options_for_select • country_select : isolated to country_select plugin • select_date : barebones helper • date_select : model object helper
  • 4. time_zone_select model select attribute <%= f.time_zone_select :time_zone, priority_zones [ ActiveSupport::TimeZone['Seoul'], ActiveSupport::TimeZone['Tokyo'],ActiveSupport::TimeZ one['Beijing'] ], :default => "Seoul" %>
  • 5. time_zone_options_for_select bare-bones select attribute <%= form_tag do %> selected <%= select_tag :time_zone, time_zone_options_for_select(nil, [ priority_zones ActiveSupport::TimeZone['Seoul'], ActiveSupport::TimeZone['Tokyo'], ActiveSupport::TimeZone['Beijing'] ] ), :default => "Seoul" %> <% end %>
  • 6. country_select • gem ‘country_select’ <%= form_for(@person) do |f| %> <div class="field"> <%= f.label :country %><br /> <%= f.country_select :country, ["Korea, Republic of"] %> </div> priority_countries <div class="actions"> <%= f.submit %> </div> <% end %> https://github.com/rails/country_select/blob/master/ lib/country_select.rb
  • 7. select_date <%= select_date Date.today, :prefix => :start_date %> <select id="start_date_year" name="start_date[year]"> ... </select> <select id="start_date_month" name="start_date[month]"> ... </select> <select id="start_date_day" name="start_date[day]"> ... </select> Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, params[:start_date] [:day].to_i)
  • 8. Individual Selects • select_year • select_month • select_day :prefix defaults to “date” • select_hour • select_minute • select_second cf. select_date
  • 9. date_select <%= date_select :person, :birth_date %> <select id="person_birth_date_1i" name="person[birth_date(1i)]"> ... </select> <select id="person_birth_date_2i" name="person[birth_date(2i)]"> ... </select> <select id="person_birth_date_3i" name="person[birth_date(3i)]"> ... </select> {:person => {'birth_date(1i)' => '2008', 'birth_date(2i)' => '11', 'birth_date(3i)' => '22'}}
  • 10. Uploading Files params[:picture] <%= form_tag({:action => :upload}, :multipart => true) do %>   <%= file_field_tag 'picture' %> <% end %>   <%= form_for @person, :multipart => true do |f| %>   <%= f.file_field :picture %> <% end %> params[:person][:picture] Since Rails 3.1, it automatically sets the multipart/ form-data with file_field in the form_for
  • 11. What gets uploaded def upload   uploaded_io = params[:person][:picture] uploaded_io   File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file|     file.write(uploaded_io.read)   end wb end an instance of a subclass of IO • original_filename • content_type : MIME type
  • 12. UploadedFile CLASS ActionDispatch::Http::UploadedFile "uploaded_file"=> #<ActionDispatch::Http::UploadedFile:0x007fd288c8fed0 @original_filename="korean_flag.png", @content_type="image/png", @headers="Content-Disposition: form-data; name="person[uploaded]"; filename="korean_flag.png"rnContent-Type: image/pngrn", @tempfile= #<File:/var/folders/rv/q26ztr693k5_58wbggd_jl300000gn/T/ RackMultipart20130107-90570-18x3nfy> >
  • 13. Upload Gems • System Requirement : ImageMagick • CarrierWave, • more flexiable than Paperclip • Rmagick gem, required! • Paperclip
  • 14. Ajaxing Upload • “remotipart” gem : AJAX style file uploads with jQuery https://github.com/leppert/remotipart
  • 15. Customizing Form Builders Pro using helper <%= form_for @person do |f| %> method   <%= text_field_with_label f, :first_name %> <% end %> or <%= form_for @person, :builder => LabellingFormBuilder do | f| %> using   <%= f.text_field :first_name %> subclassing <% end %> class LabellingFormBuilder < ActionView::Helpers::FormBuilder   def text_field(attribute, options={})     label(attribute) + super   end end app/form_builders/labelling_form_builder.rb
  • 16. Simple_form • https://github.com/plataformatec/simple_form • with Twitter Boostrap • with Foundation 3
  • 17. Params Naming Client Server Form for model obj params[:person] “@person” submit
  • 18. Basic Structures Arrays & Hashes <input id="person_name" name="person[name]" type="text" value="Henry"/> params hash {‘person’ => {‘name’ => ‘Henry’}} params[:person] {‘name’ => ‘Henry’} params[:person][:name] ‘Henry’
  • 19. Nested Hashes <input id="person_address_city" name="person[address][city]" type="text" value="New York"/> params hash {'person' => {'address' => {'city' => 'New York'}}}
  • 20. Duplicated Params array <input name="person[phone_number][]" type="text"/> <input name="person[phone_number][]" type="text"/> <input name="person[phone_number][]" type="text"/> params[:person][:phone_number] array [ ’02-333-1234’, ‘031-323-9898’, ‘062-546-2323’ ]
  • 21. hash & array Mixed Params hash nth-nested but array only one-level <input name="addresses[][line1]" type="text"/> <input name="addresses[][line2]" type="text"/> <input name="addresses[][city]" type="text"/> params[:addresses] array hash [ { ‘line1’ => ’02-333-1234’, ‘line2’ => ‘031-323-9898’, ‘city’ => ‘seoul’ } ]
  • 22. Using Form Helpers <%= form_for @person do |person_form| %>   <%= person_form.text_field :name %> address.id   <% @person.addresses.each do |address| %>     <%= person_form.fields_for address, :index => address do |address_form|%>       <%= address_form.text_field :city %>     <% end %>   <% end %> <% end %> <form accept-charset="UTF-8" action="/people/1" class="edit_person" id="edit_person_1" method="post">   <input id="person_name" name="person[name]" size="30" type="text" />   <input id="person_address_23_city" name="person[address][23][city]" size="30" type="text" />   <input id="person_address_45_city" name="person[address][45][city]" size="30" type="text" /> </form>
  • 23. Using Form Helpers params { 'person' => { 'name' => 'Bob', 'address' => { '23' => {'city' => 'Paris'}, '45' => {'city' => 'London'} } } }
  • 24. Using :index <%= fields_for 'person[address][primary]', address, :index => address do |address_form| %>   <%= address_form.text_field :city %> <% end %> or <%= fields_for 'person[address][primary][]', address do |address_form| %>   <%= address_form.text_field :city %> <% end %> <input id="person_address_primary_1_city" name="person[address][primary][1][city]" type="text" value="bologna" />
  • 25. Form to External Resources - 1 form_tag <%= form_tag 'http://farfar.away/ form', :authenticity_token => 'external_token') do %>   Form contents <% end %> <%= form_tag 'http://farfar.away/ false form', :authenticity_token => false) do %>   Form contents <% end %> payment gateway
  • 26. Form to External Resources - 2 form_for <%= form_for @invoice, :url => external_url, :authenticity_token => 'external_token' do |f|   Form contents <% end %> <%= form_for @invoice, :url => external_url, :authenticity_token => false do |f|   Form contents <% end %>
  • 27. Complex forms ROR Lab. screencasts Railscasts by Ryan Bates • Complex Forms Part 1 - Episode #73 • Complex Forms Part II - Episode #74 • Complex Forms Part III - Episode #75 • Nested Model Form (revised) - Episode #196
  • 29.   ROR Lab.