Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ruby on Rails – висхідна зірка комп’ютерних інф...docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
771.77 Кб
Скачать

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.

У виді відображаються поля для вводу інформації, що надсилається у контроллер. Особливістю моделі є те, що вона, у даному випадку, провіряє на присутність інформації у полях та правильності її написання відповідно до умови. Якщо хоч одна з цих умов не виконується – програма далі не виконується.

У моделі також можуть реалізуватися функції підрахунку тих чи інших товарів, їхньої загальної кількості (відносно прикладу, показаного вище), та багато інших аспектів.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]