MVC (Model-View-Controller) — это фундаментальная архитектурная парадигма, которую Rails реализует особенно элегантно. Рассмотрим каждый компонент и их взаимодействие в контексте Rails.
Ответственность: Работа с данными и бизнес-логикой
ActiveRecord::Base
Пример модели:
class User < ApplicationRecord
has_many :posts
validates :email, presence: true, uniqueness: true
before_create :generate_confirmation_token
def active_posts
posts.where(status: 'active')
end
private
def generate_confirmation_token
self.confirmation_token = SecureRandom.hex(10)
end
end
Где располагается: app/models/
Ответственность: Отображение данных пользователю
Пример view (ERB):
<h1><%= @user.name %></h1>
<% if @user.posts.any? %>
<ul>
<% @user.posts.each do |post| %>
<li><%= post.title %></li>
<% end %>
</ul>
<% else %>
<p>No posts yet</p>
<% end %>
<%= render 'shared/footer' %>
Где располагается: app/views/контроллер/действие.html.erb
Ответственность: Обработка запросов, посредник между Model и View
Пример контроллера:
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update]
def show
respond_to do |format|
format.html
format.json { render json: @user }
end
end
def create
@user = User.new(user_params)
if @user.save
redirect_to @user, notice: 'User created!'
else
render :new
end
end
private
def set_user
@user = User.find(params[:id])
end
def user_params
params.require(:user).permit(:name, :email, :password)
end
end
Где располагается: app/controllers/
Маршрутизация (config/routes.rb):
resources :users
Направляет /users/1
к UsersController#show
Контроллер получает запрос, загружает данные:
@user = User.find(params[:id])
Представление рендерится с данными:
<h1><%= @user.name %></h1>
Ответ отправляется клиенту
module UsersHelper
def display_user_avatar(user)
if user.avatar.present?
image_tag(user.avatar_url)
else
content_tag(:span, user.initials, class: 'avatar')
end
end
end
class UserMailer < ApplicationMailer
def welcome_email(user)
@user = user
mail(to: @user.email, subject: 'Welcome!')
end
end
class ProcessUserDataJob < ApplicationJob
queue_as :default
def perform(user)
user.process_data!
end
end
Резюмируем: Rails реализует MVC-архитектуру с добавлением своих соглашений и дополнительных компонентов. Модели отвечают за данные, представления за отображение, контроллеры за логику запросов. Эта четкая сепарация ответственностей делает Rails-приложения структурированными и поддерживаемыми.