Views are for presenting not accessing


Understanding View Layer Interactions

The View layer’s primary role in Ruby on Rails is to handle presentation logic.

This layer should not manage domain logic, which belongs in models, or orchestrate application flow, which is a controller’s responsibility.

Symptoms of MVC violation

  • Ruby code handling domain logic within ERB templates.
  • Overcomplex Ruby conditions in views, making them cumbersome.
  • Difficulty in maintaining and testing views due to excessive logic.

Impact

This melding of concerns not only deviates from the MVC architecture but also complicates debugging and future code modifications.

Such practices can escalate maintenance costs and diminish the codebase’s scalability and readability, thus hindering team collaboration and efficiency.

Solution: Add Useful Accessors to Your Models

Refactoring for Clarity and Maintenance

Instead of bloating the views with logic, encapsulate these within models or helpers based on their relevance to presentation or domain logic, respectively.

Let’s compare poorly managed code with a well-refactored Rails view:

Non-Ideal Code Example

# app/views/posts/show.html.erb
<% if current_user && (current_user == @post.user || @post.editors.include?(current_user)) && @post.editable? && @post.user.active? %>
  <%= link_to 'Edit this post', edit_post_url(@post) %>
<% end %>

Refactored Code Example

Moving the logic to the model clarifies and simplifies the view, as demonstrated:

# app/models/post.rb
# Includes: user_id (integer, foreign key), editable (boolean)
class Post < ApplicationRecord
  belongs_to :user
  has_many :editors, through: :post_editors

  def editable_by?(user)
    user && (user == self.user || editors.include?(user)) && editable? && user.active?
  end
end

# app/views/posts/show.html.erb
<% if  @post.editable_by?(current_user) %>
  <%= link_to 'Edit this post', edit_post_url(@post) %>
<% end  %>

Commentary

The method editable_by? is logically part of the domain concerning user permissions related to a post.

By placing this method within the Post model, we keep our views clean and focused solely on presentation aspects.

This approach not only aids in testing but also adheres to the principle of SoC, a cornerstone of maintainable and scalable software architecture.

Best Practice: Use Helpers for Presentation

Presentation-specific methods should reside in helpers. Consider a scenario involving a visual display adjustment:

# app/helpers/jobs_helper.rb
module JobsHelper
  def display_title(job)
    job.title.split(/\s*\/\s*/).join(" / ")
  # Ensures that job titles in the view are presented with space around slashes for better readability and design consistency.
  end
end

Summary

  • Helpers == Presentation adjustments
  • Model methods == Questions to ask the model

Adhering to MVC principles by correctly positioning logic in models, controllers, or helpers simplifies the maintenance and enhancement of Rails applications.

Keep your views clean; let them focus purely on presentation, leveraging models and helpers for all else.


Related posts

Free Training By Email:
Building a Rails Engine

We will send udpates but we care about your data.
No spams.

Back to homepage