
- •Розділ і: еволюція інструментальних технологій в середовищі Ruby on Rails
- •1. Знайомство з Ruby on Rails
- •2. Поговоримо про Ruby
- •3 . Філософія Ruby
- •4. Можливості Ruby
- •5. Переваги Rails
- •6. Філософія Ruby on Rails
- •7. Як працює mvc в Ruby on Rails?
- •8. Active Record
- •9. Скаффолдинг
- •10. Ajax (Asynchronous JavaScript and xml)
- •1. Популярність серед користувачів
- •2. Мови програмування
- •3. Концептуальна суть Rails та Django
- •4. Модель і база даних
- •5. Url Роутинг та контроллери
- •6. Контроллер, вид
- •7. Шаблон і форма
- •8. Адміністрування користувача
- •9. Ajax
- •10. Засоби для тестування
7. Як працює mvc в Ruby on Rails?
Класи моделей в RoR будуються на основі бібліотеки Active Record, яка, в свою чергу, реалізує об’єктно-реляційне відображення даних, що зберігаються в БД.
Для відображення користувацького інтерфейсу передбачений клас ActionView, який вдало реалізує шаблонну систему.
Класи взаємодії з користувачем будуються на основі класів ActionController. Саме в контролері оприділяються методи, які в подальшому стають доступними через веб за URL типу http://example.com/app/class/method. По замовчуванню, з кожним методом зв’язаний шаблон виду /app/views/class/method.html.erb. В ActionController визначаються різноманітні допоміжні методи для управління всіма аспектами взаємодії з користувачем та генерації коду, який дуже часто використовується, наприклад для операцій Create, Remove, Update, Delete (CRUD) та при роботі з базою даних.
HTTP
HTTP
Пропоную на конкретному прикладі розглянути як працює MVC. І заразом ближче познайомитися з Ruby.
Controller:
class ProductsController < ApplicationController
# GET /products/new
# GET /products/new.xml
def new
@product = Product.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @product }
end
end
# POST /products
# POST /products.xml
def create
@product = Product.new(params[:product])
respond_to do |format|
if @product.save
flash[:notice] = 'Product was successfully created.'
format.html { redirect_to(@product) }
format.xml { render :xml => @product, :status => :created, :location => @product }
else
format.html { render :action => "new" }
format.xml { render :xml => @product.errors, :status => :unprocessable_entity }
end
end
end
end
Model:
class Product < ActiveRecord::Base
def self.find_products_for_sale
find(:all, :order => "title")
end
validates_presence_of :title, :description, :image_url
validates_numericality_of :price
validates_uniqueness_of :title
validates_format_of :image_url,
:with => %r{\.(gif|jpg|png)$}i,
:message => "Must be name of format"
protected
def validate
errors.add(:price, "Must be >0") if price.nil? || price < 0.01
end
end
View:
<h1>New product</h1>
<% form_for(@product) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.label :description %><br />
<%= f.text_area :description %>
</p>
<p>
<%= f.label :image_url %><br />
<%= f.text_field :image_url %>
</p>
<p>
<%= f.label :price %><br />
<%= f.text_field :price %>
</p>
<p>
<%= f.submit 'Create' %>
</p>
<% end %>
<%= link_to 'Back', products_path %>
Клієнт подає запит на сервер. Останній, в свою чергу, формує повідомлення в контролер, який містить в собі методи. Контролер відшукує серед своїх методів потрібний для відповіді на запит. Певний метод має своє відображення, тому точно присутній у виді. Не завжди він відображається в моделі. Модель служить своєрідною маскою через яку проходять результати обробки даних методом контролера. І, нарешті, з виду повідомлення потрапляє назад до клієнта.
У даному прикладі є контролер Products з визначеними методами new create.
У виді відображаються поля для вводу інформації, що надсилається у контроллер. Особливістю моделі є те, що вона, у даному випадку, провіряє на присутність інформації у полях та правильності її написання відповідно до умови. Якщо хоч одна з цих умов не виконується – програма далі не виконується.
У моделі також можуть реалізуватися функції підрахунку тих чи інших товарів, їхньої загальної кількості (відносно прикладу, показаного вище), та багато інших аспектів.