Introduction to ViewObjects


In Ruby on Rails, view objects are an essential part of the Model-View-Controller (MVC) architecture. They play a crucial role in separating the presentation logic from the business logic of your application. In this detailed article, we will explore what view objects are, why they are important, how to create and use them effectively, and some best practices to follow.

View objects, also known as presenter objects or decorators, are Ruby classes responsible for encapsulating presentation logic. They act as intermediaries between the controller and the view, ensuring that the view receives the necessary data and methods to render content without cluttering the view templates with complex logic.

Why we should View Objects?

  • One of the primary benefits of view objects is the separation of concerns. By moving presentation logic out of the views and controllers, you can keep your codebase clean, organized, and more maintainable.
  • View objects can be reused across multiple views and even in different parts of your application. This reusability promotes DRY (Don't Repeat Yourself) principles and reduces code duplication.
  • View objects can be easily tested in isolation, making it simpler to write and maintain tests for your presentation logic. This enhances the overall test coverage of your application.

Creating View Objects

Creating view objects in Rails is straightforward. You typically create a new Ruby class in the app/presenters directory. Let's say you're building a blog application and want to create a view object for blog post rendering:

# app/presenters/product_presenter.rb

class ProductPresenter
  def initialize(product)
    @product = product

  def title

  def formatted_content
    # Add any presentation logic here

Using View Objects in Rails

To use a view object in your view template, you'll first need to create an instance of it in your controller action and then pass it to the view. Here's an example of how to use the ProductPresenter:

# app/controllers/products_controller.rb

class ProductsController < ApplicationController
  def show
    @product = Product.find(params[:id])
    @presenter =

Now, in your view template (app/views/products/show.html.erb), you can access the methods defined in the ProductPresenter:

<!-- app/views/products/show.html.erb -->

<h1><%= @presenter.title %></h1>
<div><%= @presenter.formatted_content %></div>

Best Practices for View Objects

To make the most of view objects in your Rails application, consider the following best practices:

  • Use Descriptive Names - Give your view objects descriptive names that clearly indicate their purpose and what they present. For example, BlogPostPresenter is more informative than PostPresenter.
  • Keep It Simple - View objects should contain minimal logic and focus on presentation concerns. If you find yourself adding complex business logic, reconsider your design.
  • Single Responsibility - Follow the Single Responsibility Principle (SRP). Each view object should have a single responsibility, such as formatting text, handling dates, or generating HTML.
  • Avoid Direct Model Access - Avoid accessing the model directly from your view. Instead, encapsulate the model-related logic within the view object.
  • Testing - Write unit tests for your view objects to ensure they behave as expected. You can use testing frameworks like RSpec or MiniTest for this purpose.

View objects are a valuable tool in Ruby on Rails for separating presentation logic from the rest of your application. They enhance maintainability, reusability, and testability while promoting a clean and organized codebase. By following best practices and incorporating view objects into your Rails development workflow, you can create more robust and maintainable web applications.

Read more on our blog

Check out the knowledge base collected and distilled by experienced

How many times have you searched for that one specific library that meets your needs? How much time have you spent customizing it to fit your project's requirements? I must admit, waaay too much. T...


Continuing with the latest streak of Hanami focused posts I am bringing you another example of a common feature and implementation, translated to Hanami.

I recently showed some [email-password a...

Powstańców Warszawy 5
15-129 Białystok

+48 668 842 999