SlideShare a Scribd company logo
ROR Lab. Season 2
   - The 4th Round -



Getting Started
 with Rails (4)

    August 11, 2012

     Hyoseong Choi
       ROR Lab.
A Blog Project

                                    Post
                              ny




                                              on
                             a
                            m
separate form                                           nested form



                                                 e
                       to          form_for




                                                to
                  ne




                                                     m
                                                      an
                 o




                                                        y
      Comment                                               Tag

      form_for                                         fields_for



                                                                   ROR Lab.
Generating the 3rd
   Model : Tag
  $ rails generate model tag
                 name:string
                 post:references


                                                  Migration file
        Model Class                     : db/migrate/xxxx_create_tag.rb
    : app/models/tag.rb

         Tag                                       tags
                          $ rake db:migrate


 belongs_to :post                        post_id :integer
  post:references
                                                              ROR Lab.
Nested Attributes
• save the child object through the parent
  object
• Off, by default
• switch “On”, by calling
  #accepts_nested_attributes_for
  •   an attribute writer automatically defined on the parent
      model
  •   :autosave option automatically enabled

  http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html


                                                                               ROR Lab.
Building a Multi-
        Model Form                                      ✔




class Post < ActiveRecord::Base
  attr_accessible :content, :name, :title, :tags_attributes

  validates :name,  :presence => true
  validates :title, :presence => true,
                    :length => { :minimum => 5 }
 
  has_many :comments, :dependent => :destroy
  has_many :tags
                                                         ✔
  accepts_nested_attributes_for :tags, :allow_destroy => :true,
    :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }
end                    ✔



  multi-model form or nested form or form in form
                                                                    ROR Lab.
#accepts_nested
   _attributes_for
• tags_attributes=(attributes)
• :allow_destroy => true
  “_destroy” key, evaluated to true
• :reject_if => proc { |attributes|
  attributes[‘name’].blank? }
• :reject_if => proc { |attrs| attrs.all? { |k,v|
  v.blank?} }
                                             ROR Lab.
build vs new

• new ➞ for Class
  ex) post = Post.new
• build ➞ for association proxy
  ex) comment = post.comments.build
  ✓ automatic setting its foreign key for the
    new child object with patient object id


                                         ROR Lab.
<% @post.tags.build %>
<%= form_for(@post) do |post_form| %> 
  <div class="field">
    <%= post_form.label :name %><br />
    <%= post_form.text_field :name %>
  </div>
  <div class="field">
    <%= post_form.label :title %><br />
    <%= post_form.text_field :title %>
  </div>
  <div class="field">
    <%= post_form.label :content %><br />
    <%= post_form.text_area :content %>
  </div>

  <h2>Tags</h2>
  <%= post_form.fields_for :tags do |tag_form| %>
   <div class="field">
     <%= tag_form.label :name, 'Tag:' %>
     <%= tag_form.text_field :name %>
   </div>
   <% unless tag_form.object.nil? || tag_form.object.new_record? %>
     <div class="field">
       <%= tag_form.label :_destroy, 'Remove:' %>
       <%= tag_form.check_box :_destroy %>
     </div>
   <% end %>
  <% end %>

  <div class="actions">
    <%= post_form.submit %>
  </div>
<% end %>
                                                                      ✔   app/views/posts/_form.html.erb

                                                                                             ROR Lab.
<% @post.tags.build %>
<%= form_for(@post) do |post_form| %> 
  <div class="field">
    <%= post_form.label :name %><br />
    <%= post_form.text_field :name %>
  </div>
  <div class="field">
    <%= post_form.label :title %><br />
    <%= post_form.text_field :title %>
  </div>
  <div class="field">
    <%= post_form.label :content %><br />                     accets_nested_attributes_for :tags
    <%= post_form.text_area :content %>
  </div>

  <h2>Tags</h2>
  <%= post_form.fields_for :tags do |tag_form| %>
   <div class="field">
     <%= tag_form.label :name, 'Tag:' %>
     <%= tag_form.text_field :name %>
   </div>
   <% unless tag_form.object.nil? || tag_form.object.new_record? %>
     <div class="field">
       <%= tag_form.label :_destroy, 'Remove:' %>
       <%= tag_form.check_box :_destroy %>
     </div>
   <% end %>
  <% end %>

  <div class="actions">
    <%= post_form.submit %>
  </div>
<% end %>
                                                                      ✔   app/views/posts/_form.html.erb

                                                                                               ROR Lab.
<% @post.tags.build %>
<%= form_for(@post) do |post_form| %> 
  <div class="field">
    <%= post_form.label :name %><br />
    <%= post_form.text_field :name %>
  </div>
  <div class="field">
    <%= post_form.label :title %><br />
    <%= post_form.text_field :title %>
  </div>
  <div class="field">
    <%= post_form.label :content %><br />                     accets_nested_attributes_for :tags
    <%= post_form.text_area :content %>
  </div>
                                                             tags_attributes
  <h2>Tags</h2>
  <%= post_form.fields_for :tags do |tag_form| %>
   <div class="field">
     <%= tag_form.label :name, 'Tag:' %>
     <%= tag_form.text_field :name %>
   </div>
   <% unless tag_form.object.nil? || tag_form.object.new_record? %>
     <div class="field">
       <%= tag_form.label :_destroy, 'Remove:' %>
       <%= tag_form.check_box :_destroy %>
     </div>
   <% end %>
  <% end %>

  <div class="actions">
    <%= post_form.submit %>
  </div>
<% end %>
                                                                      ✔   app/views/posts/_form.html.erb

                                                                                               ROR Lab.
<% @post.tags.build %>
<%= form_for(@post) do |post_form| %>
  <% if @post.errors.any? %>
  <div id="errorExplanation">
    <h2><%= pluralize(@post.errors.count, "error") %>   prohibited this post from being saved:</h2>
    <ul>
    <% @post.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>                                               <%= form.fields_for :tags do |tag_form| %>
  </div>                                                  <div class="field">
  <% end %>                                                 <%= tag_form.label :name, 'Tag:' %>
                                                            <%= tag_form.text_field :name %>
  <div class="field">
                                                          </div>
    <%= post_form.label :name %><br />
                                                          <% unless tag_form.object.nil? || tag_form.object.new_record? %>
    <%= post_form.text_field :name %>
                                                            <div class="field">
  </div>
                                                              <%= tag_form.label :_destroy, 'Remove:' %>
  <div class="field">
                                                              <%= tag_form.check_box :_destroy %>
    <%= post_form.label :title %><br />
                                                            </div>
    <%= post_form.text_field :title %>
                                                          <% end %>
  </div>
                                                        <% end %>
  <div class="field">                                                                          ✔ app/views/tags/_form.html.erb
    <%= post_form.label :content %><br />
    <%= post_form.text_area :content %>
  </div>
  <h2>Tags</h2>
  <%= render :partial => 'tags/form',
             :locals => {:form => post_form} %>
  <div class="actions">
    <%= post_form.submit %>
  </div>
<% end %>
                                                                          ✔   app/views/posts/_form.html.erb


                                                                                                               ROR Lab.
<p id="notice"><%= notice %></p>
 
<p>
  <b>Name:</b>
  <%= @post.name %>
</p>
 
<p>                                                   module PostsHelper
  <b>Title:</b>                                         def join_tags(post)
  <%= @post.title %>                                      post.tags.map { |t| t.name }.join(", ")
</p>                                                    end
                                                      end
<p>
  <b>Content:</b>
                                                                 ✔ app/helpers/posts_helper.rb
  <%= @post.content %>
</p>
 
<p>
                                                      <p>
  <b>Tags:</b>
                                                        <b>Tags:</b>
  <%= @post.tags.map { |t| t.name }.join(", ") %>
                                                        <%= join_tags(@post) %>
</p>
                                                      </p>
 
<h2>Comments</h2>
<%= render @post.comments %>
 
<h2>Add a comment:</h2>
<%= render "comments/form" %>
 
 
<%= link_to 'Edit Post', edit_post_path(@post) %> |
<%= link_to 'Back to Posts', posts_path %> |

                ✔ app/views/posts/show.html.erb


                                                                                            ROR Lab.
<p id="notice"><%= notice %></p>
 
<p>
  <b>Name:</b>
  <%= @post.name %>
</p>
 
<p>                                                   module PostsHelper
  <b>Title:</b>                                         def join_tags(post)
  <%= @post.title %>                                      post.tags.map { |t| t.name }.join(", ")
</p>                                                    end
                                                      end
<p>
  <b>Content:</b>
                                                                 ✔ app/helpers/posts_helper.rb
  <%= @post.content %>
</p>
 
<p>
                                                      <p>
  <b>Tags:</b>
                                                        <b>Tags:</b>
  <%= join_tags(@post) %>
                                                        <%= join_tags(@post) %>
</p>
                                                      </p>
 
<h2>Comments</h2>
<%= render @post.comments %>
 
<h2>Add a comment:</h2>
<%= render "comments/form" %>
 
 
<%= link_to 'Edit Post', edit_post_path(@post) %> |
<%= link_to 'Back to Posts', posts_path %> |

                ✔ app/views/posts/show.html.erb


                                                                                            ROR Lab.
Live Demo
Creating a project ~ 3rd model, Tag




                                      ROR Lab.
감사합니다.

More Related Content

PDF
Django Templates
PDF
Django Bogotá. CBV
PDF
Ch9 .Best Practices for Class-Based Views
PDF
AngularJS vs. Ember.js vs. Backbone.js
PDF
HTML5 Accessibility
PDF
PPTX
DJango admin interface
PDF
JSP Syntax_1
Django Templates
Django Bogotá. CBV
Ch9 .Best Practices for Class-Based Views
AngularJS vs. Ember.js vs. Backbone.js
HTML5 Accessibility
DJango admin interface
JSP Syntax_1

Viewers also liked (7)

PDF
Active Record callbacks and Observers, Season 1
PDF
Active Support Core Extensions (1)
KEY
Routing 2, Season 1
KEY
Getting started with Rails (3), Season 2
PDF
Getting Started with Rails (2)
KEY
ActiveRecord Association (1), Season 2
KEY
Active Record Query Interface (1), Season 2
Active Record callbacks and Observers, Season 1
Active Support Core Extensions (1)
Routing 2, Season 1
Getting started with Rails (3), Season 2
Getting Started with Rails (2)
ActiveRecord Association (1), Season 2
Active Record Query Interface (1), Season 2
Ad

Similar to Getting started with Rails (4), Season 2 (20)

PDF
Action View Form Helpers - 1, Season 2
KEY
Getting started with Rails (2), Season 2
PDF
Action View Form Helpers - 2, Season 2
PDF
OSDC 2009 Rails Turtorial
PDF
Django Vs Rails
PDF
Your Custom WordPress Admin Pages Suck
KEY
Building a Rails Interface
PDF
Engines: Team Development on Rails (2005)
PDF
Ajax nested form and ajax upload in rails
PDF
Desenvolvimento web com Ruby on Rails (parte 4)
PDF
Ruby on Rails at PROMPT ISEL '11
PDF
Desenvolvimento web com Ruby on Rails (parte 6)
PPTX
Template-based Modular Architecture
KEY
Rails Antipatterns | Open Session with Chad Pytel
PDF
Desenvolvimento web com Ruby on Rails (parte 2)
PPT
Boston Computing Review - Ruby on Rails
PDF
Curso Symfony - Clase 4
PDF
Curso Symfony - Clase 3
PPT
Django Forms: Best Practices, Tips, Tricks
PPTX
Web development today
Action View Form Helpers - 1, Season 2
Getting started with Rails (2), Season 2
Action View Form Helpers - 2, Season 2
OSDC 2009 Rails Turtorial
Django Vs Rails
Your Custom WordPress Admin Pages Suck
Building a Rails Interface
Engines: Team Development on Rails (2005)
Ajax nested form and ajax upload in rails
Desenvolvimento web com Ruby on Rails (parte 4)
Ruby on Rails at PROMPT ISEL '11
Desenvolvimento web com Ruby on Rails (parte 6)
Template-based Modular Architecture
Rails Antipatterns | Open Session with Chad Pytel
Desenvolvimento web com Ruby on Rails (parte 2)
Boston Computing Review - Ruby on Rails
Curso Symfony - Clase 4
Curso Symfony - Clase 3
Django Forms: Best Practices, Tips, Tricks
Web development today
Ad

More from RORLAB (20)

PDF
Getting Started with Rails (4)
PDF
Getting Started with Rails (3)
PDF
Getting Started with Rails (1)
PDF
Self join in active record association
PDF
Asset Pipeline in Ruby on Rails
PDF
레일스가이드 한글번역 공개프로젝트 RORLabGuides 소개
PDF
Active Support Core Extension (3)
PDF
Active Support Core Extension (2)
PDF
Action Controller Overview, Season 2
PDF
Layouts and Rendering in Rails, Season 2
PDF
ActiveRecord Query Interface (2), Season 2
KEY
Active Record Association (2), Season 2
KEY
ActiveRecord Callbacks & Observers, Season 2
KEY
ActiveRecord Validations, Season 2
KEY
Rails Database Migration, Season 2
KEY
Getting started with Rails (1), Season 2
KEY
Routing 1, Season 1
KEY
Action Controller Overview, Season 1
KEY
Active Record Form Helpers, Season 1
KEY
Active Record Query Interface (2), Season 1
Getting Started with Rails (4)
Getting Started with Rails (3)
Getting Started with Rails (1)
Self join in active record association
Asset Pipeline in Ruby on Rails
레일스가이드 한글번역 공개프로젝트 RORLabGuides 소개
Active Support Core Extension (3)
Active Support Core Extension (2)
Action Controller Overview, Season 2
Layouts and Rendering in Rails, Season 2
ActiveRecord Query Interface (2), Season 2
Active Record Association (2), Season 2
ActiveRecord Callbacks & Observers, Season 2
ActiveRecord Validations, Season 2
Rails Database Migration, Season 2
Getting started with Rails (1), Season 2
Routing 1, Season 1
Action Controller Overview, Season 1
Active Record Form Helpers, Season 1
Active Record Query Interface (2), Season 1

Recently uploaded (20)

PPTX
Pharma ospi slides which help in ospi learning
PDF
Supply Chain Operations Speaking Notes -ICLT Program
PPTX
human mycosis Human fungal infections are called human mycosis..pptx
PDF
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
PPTX
Institutional Correction lecture only . . .
PDF
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
PPTX
Pharmacology of Heart Failure /Pharmacotherapy of CHF
PPTX
Introduction_to_Human_Anatomy_and_Physiology_for_B.Pharm.pptx
PPTX
Introduction to Child Health Nursing – Unit I | Child Health Nursing I | B.Sc...
PDF
Microbial disease of the cardiovascular and lymphatic systems
PDF
Classroom Observation Tools for Teachers
PDF
FourierSeries-QuestionsWithAnswers(Part-A).pdf
PDF
Basic Mud Logging Guide for educational purpose
PDF
TR - Agricultural Crops Production NC III.pdf
PPTX
IMMUNITY IMMUNITY refers to protection against infection, and the immune syst...
PDF
2.FourierTransform-ShortQuestionswithAnswers.pdf
PDF
STATICS OF THE RIGID BODIES Hibbelers.pdf
PDF
O7-L3 Supply Chain Operations - ICLT Program
PPTX
Microbial diseases, their pathogenesis and prophylaxis
PDF
Insiders guide to clinical Medicine.pdf
Pharma ospi slides which help in ospi learning
Supply Chain Operations Speaking Notes -ICLT Program
human mycosis Human fungal infections are called human mycosis..pptx
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
Institutional Correction lecture only . . .
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
Pharmacology of Heart Failure /Pharmacotherapy of CHF
Introduction_to_Human_Anatomy_and_Physiology_for_B.Pharm.pptx
Introduction to Child Health Nursing – Unit I | Child Health Nursing I | B.Sc...
Microbial disease of the cardiovascular and lymphatic systems
Classroom Observation Tools for Teachers
FourierSeries-QuestionsWithAnswers(Part-A).pdf
Basic Mud Logging Guide for educational purpose
TR - Agricultural Crops Production NC III.pdf
IMMUNITY IMMUNITY refers to protection against infection, and the immune syst...
2.FourierTransform-ShortQuestionswithAnswers.pdf
STATICS OF THE RIGID BODIES Hibbelers.pdf
O7-L3 Supply Chain Operations - ICLT Program
Microbial diseases, their pathogenesis and prophylaxis
Insiders guide to clinical Medicine.pdf

Getting started with Rails (4), Season 2

  • 1. ROR Lab. Season 2 - The 4th Round - Getting Started with Rails (4) August 11, 2012 Hyoseong Choi ROR Lab.
  • 2. A Blog Project Post ny on a m separate form nested form e to form_for to ne m an o y Comment Tag form_for fields_for ROR Lab.
  • 3. Generating the 3rd Model : Tag $ rails generate model tag name:string post:references Migration file Model Class : db/migrate/xxxx_create_tag.rb : app/models/tag.rb Tag tags $ rake db:migrate belongs_to :post post_id :integer post:references ROR Lab.
  • 4. Nested Attributes • save the child object through the parent object • Off, by default • switch “On”, by calling #accepts_nested_attributes_for • an attribute writer automatically defined on the parent model • :autosave option automatically enabled http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html ROR Lab.
  • 5. Building a Multi- Model Form ✔ class Post < ActiveRecord::Base   attr_accessible :content, :name, :title, :tags_attributes   validates :name,  :presence => true   validates :title, :presence => true,                     :length => { :minimum => 5 }     has_many :comments, :dependent => :destroy   has_many :tags   ✔   accepts_nested_attributes_for :tags, :allow_destroy => :true,     :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } } end ✔ multi-model form or nested form or form in form ROR Lab.
  • 6. #accepts_nested _attributes_for • tags_attributes=(attributes) • :allow_destroy => true “_destroy” key, evaluated to true • :reject_if => proc { |attributes| attributes[‘name’].blank? } • :reject_if => proc { |attrs| attrs.all? { |k,v| v.blank?} } ROR Lab.
  • 7. build vs new • new ➞ for Class ex) post = Post.new • build ➞ for association proxy ex) comment = post.comments.build ✓ automatic setting its foreign key for the new child object with patient object id ROR Lab.
  • 8. <% @post.tags.build %> <%= form_for(@post) do |post_form| %>    <div class="field">     <%= post_form.label :name %><br />     <%= post_form.text_field :name %>   </div>   <div class="field">     <%= post_form.label :title %><br />     <%= post_form.text_field :title %>   </div>   <div class="field">     <%= post_form.label :content %><br />     <%= post_form.text_area :content %>   </div>   <h2>Tags</h2>   <%= post_form.fields_for :tags do |tag_form| %>    <div class="field">      <%= tag_form.label :name, 'Tag:' %>      <%= tag_form.text_field :name %>    </div>    <% unless tag_form.object.nil? || tag_form.object.new_record? %>      <div class="field">        <%= tag_form.label :_destroy, 'Remove:' %>        <%= tag_form.check_box :_destroy %>      </div>    <% end %> <% end %>   <div class="actions">     <%= post_form.submit %>   </div> <% end %> ✔ app/views/posts/_form.html.erb ROR Lab.
  • 9. <% @post.tags.build %> <%= form_for(@post) do |post_form| %>    <div class="field">     <%= post_form.label :name %><br />     <%= post_form.text_field :name %>   </div>   <div class="field">     <%= post_form.label :title %><br />     <%= post_form.text_field :title %>   </div>   <div class="field">     <%= post_form.label :content %><br /> accets_nested_attributes_for :tags     <%= post_form.text_area :content %>   </div>   <h2>Tags</h2>   <%= post_form.fields_for :tags do |tag_form| %>    <div class="field">      <%= tag_form.label :name, 'Tag:' %>      <%= tag_form.text_field :name %>    </div>    <% unless tag_form.object.nil? || tag_form.object.new_record? %>      <div class="field">        <%= tag_form.label :_destroy, 'Remove:' %>        <%= tag_form.check_box :_destroy %>      </div>    <% end %> <% end %>   <div class="actions">     <%= post_form.submit %>   </div> <% end %> ✔ app/views/posts/_form.html.erb ROR Lab.
  • 10. <% @post.tags.build %> <%= form_for(@post) do |post_form| %>    <div class="field">     <%= post_form.label :name %><br />     <%= post_form.text_field :name %>   </div>   <div class="field">     <%= post_form.label :title %><br />     <%= post_form.text_field :title %>   </div>   <div class="field">     <%= post_form.label :content %><br /> accets_nested_attributes_for :tags     <%= post_form.text_area :content %>   </div> tags_attributes   <h2>Tags</h2>   <%= post_form.fields_for :tags do |tag_form| %>    <div class="field">      <%= tag_form.label :name, 'Tag:' %>      <%= tag_form.text_field :name %>    </div>    <% unless tag_form.object.nil? || tag_form.object.new_record? %>      <div class="field">        <%= tag_form.label :_destroy, 'Remove:' %>        <%= tag_form.check_box :_destroy %>      </div>    <% end %> <% end %>   <div class="actions">     <%= post_form.submit %>   </div> <% end %> ✔ app/views/posts/_form.html.erb ROR Lab.
  • 11. <% @post.tags.build %> <%= form_for(@post) do |post_form| %>   <% if @post.errors.any? %>   <div id="errorExplanation">     <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>     <ul>     <% @post.errors.full_messages.each do |msg| %>       <li><%= msg %></li>     <% end %>     </ul> <%= form.fields_for :tags do |tag_form| %>   </div>   <div class="field">   <% end %>     <%= tag_form.label :name, 'Tag:' %>       <%= tag_form.text_field :name %>   <div class="field">   </div>     <%= post_form.label :name %><br />   <% unless tag_form.object.nil? || tag_form.object.new_record? %>     <%= post_form.text_field :name %>     <div class="field">   </div>       <%= tag_form.label :_destroy, 'Remove:' %>   <div class="field">       <%= tag_form.check_box :_destroy %>     <%= post_form.label :title %><br />     </div>     <%= post_form.text_field :title %>   <% end %>   </div> <% end %>   <div class="field"> ✔ app/views/tags/_form.html.erb     <%= post_form.label :content %><br />     <%= post_form.text_area :content %>   </div>   <h2>Tags</h2>   <%= render :partial => 'tags/form',              :locals => {:form => post_form} %>   <div class="actions">     <%= post_form.submit %>   </div> <% end %> ✔ app/views/posts/_form.html.erb ROR Lab.
  • 12. <p id="notice"><%= notice %></p>   <p>   <b>Name:</b>   <%= @post.name %> </p>   <p> module PostsHelper   <b>Title:</b>   def join_tags(post)   <%= @post.title %>     post.tags.map { |t| t.name }.join(", ") </p>   end   end <p>   <b>Content:</b> ✔ app/helpers/posts_helper.rb   <%= @post.content %> </p>   <p> <p>   <b>Tags:</b>   <b>Tags:</b>   <%= @post.tags.map { |t| t.name }.join(", ") %>   <%= join_tags(@post) %> </p> </p>   <h2>Comments</h2> <%= render @post.comments %>   <h2>Add a comment:</h2> <%= render "comments/form" %>     <%= link_to 'Edit Post', edit_post_path(@post) %> | <%= link_to 'Back to Posts', posts_path %> | ✔ app/views/posts/show.html.erb ROR Lab.
  • 13. <p id="notice"><%= notice %></p>   <p>   <b>Name:</b>   <%= @post.name %> </p>   <p> module PostsHelper   <b>Title:</b>   def join_tags(post)   <%= @post.title %>     post.tags.map { |t| t.name }.join(", ") </p>   end   end <p>   <b>Content:</b> ✔ app/helpers/posts_helper.rb   <%= @post.content %> </p>   <p> <p>   <b>Tags:</b>   <b>Tags:</b>   <%= join_tags(@post) %>   <%= join_tags(@post) %> </p> </p>   <h2>Comments</h2> <%= render @post.comments %>   <h2>Add a comment:</h2> <%= render "comments/form" %>     <%= link_to 'Edit Post', edit_post_path(@post) %> | <%= link_to 'Back to Posts', posts_path %> | ✔ app/views/posts/show.html.erb ROR Lab.
  • 14. Live Demo Creating a project ~ 3rd model, Tag ROR Lab.
  • 16.   ROR Lab.

Editor's Notes