📖 Scenario: You are building a simple Rails web app where users can submit a form to create a new article. You want to show error messages clearly if the user submits invalid data.
🎯 Goal: Create a Rails form for a new Article that shows error messages above the form fields when validation fails.
📋 What You'll Learn
Create an Article model with validations
Add a controller action to handle new article creation
Display error messages in the form view when validations fail
Use Rails helpers to show errors in a user-friendly way
💡 Why This Matters
🌍 Real World
Showing clear error messages in forms is essential for good user experience in web apps. It helps users fix mistakes and submit correct data.
💼 Career
Understanding Rails validations, controller logic, and error display is a core skill for Rails developers building user-friendly web applications.
Progress0 / 4 steps
1
Create the Article model with validations
Create a Rails model called Article with a title attribute that must be present (not blank). Write the validation inside the model file.
Ruby on Rails
Hint
Use validates :title, presence: true inside the model class.
2
Add the ArticlesController with new and create actions
Create an ArticlesController with new and create actions. In new, initialize @article = Article.new. In create, build @article = Article.new(article_params) and save it. If save fails, render :new again.
Ruby on Rails
Hint
Remember to permit :title in article_params.
3
Create the form view with error messages display
In the new.html.erb view, create a form for @article using form_with. Above the form fields, add code to display error messages if @article.errors.any?. Show a heading and list each error message inside an unordered list.
Ruby on Rails
Hint
Use form_with model: @article, local: true and check @article.errors.any? to show errors.
4
Add flash notice display and final touches
In the application layout or above the form in new.html.erb, add code to display the flash notice if present. Use flash[:notice] inside a div with id notice. This will show success messages after article creation.
Ruby on Rails
Hint
Use if flash[:notice] and show it inside a div with id notice.
Practice
(1/5)
1. In Rails, which method provides a list of user-friendly error messages for a model's validation errors?
easy
A. @model.errors.count
B. @model.errors.details
C. @model.errors.keys
D. @model.errors.full_messages
Solution
Step 1: Understand error message methods
@model.errors.full_messages returns an array of readable error strings, while others return metadata or counts.
Step 2: Identify user-friendly output
Only full_messages gives clear, complete error messages suitable for display.
Final Answer:
@model.errors.full_messages -> Option D
Quick Check:
Error messages = full_messages [OK]
Hint: Use full_messages for readable error text [OK]
Common Mistakes:
Using errors.details which gives error codes, not messages
Using errors.keys which lists fields, not messages
Using errors.count which returns number, not messages
2. Which of the following is the correct way to display error messages for a @user model in a Rails view?
easy
A. <%= @user.errors.full_messages.each do |msg| %>
<%= msg %>
<% end %>
B. <% @user.errors.full_messages.each do |msg| %>
<%= msg %>
<% end %>
C. <%= @user.errors.full_messages.map { |msg| content_tag(:p, msg) } %>
D. <% @user.errors.full_messages.map { |msg| content_tag(:p, msg) } %>
Solution
Step 1: Understand ERB tags for iteration
<% %> runs Ruby code without output; <%= %> outputs the result. For loops, use <% %>.
Step 2: Identify correct syntax for displaying messages
<% @user.errors.full_messages.each do |msg| %>
<%= msg %>
<% end %> correctly uses <% %> to loop and <%= %> inside to output each message.
Final Answer:
Option B -> Option B
Quick Check:
Loop with <% %>, output with <%= %> [OK]
Hint: Use <% %> for loops, <%= %> for output inside loops [OK]
Common Mistakes:
Using <%= %> for loops causing unwanted output
Using map without outputting results
Mixing output and code tags incorrectly
3. Given this Rails code in a view:
<ul>
<% @post.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
What will be the output if @post.errors.full_messages contains ["Title can't be blank", "Content is too short"]?
medium
A.
Title can't be blank
Content is too short
B.
Title can't be blankContent is too short
C.
Title can't be blank
Content is too short
D. No output because of syntax error
Solution
Step 1: Understand the loop output
The code loops over each error message and wraps it in
tags inside a <ul>.
Step 2: Match output to HTML structure
The output will be a <ul> list with two
items showing each error message.
Final Answer:
<ul><li>Title can't be blank</li><li>Content is too short</li></ul> -> Option A
Quick Check:
Loop creates list items inside ul [OK]
Hint: Errors inside <li> tags within <ul> show as list [OK]
Common Mistakes:
Forgetting <ul> tags causing invalid HTML
Not using <li> tags for each message
Confusing output with plain text
4. You wrote this code to display errors:
<%= @article.errors.full_messages.each do |msg| %>
<p><%= msg %></p>
<% end %>
But no errors show up in the browser. What is the problem?
medium
A. The <code><p>s
B. You must call to_s on each message before displaying
C. Using <code><%= %>s
D. The errors array is empty, so nothing shows
Solution
Step 1: Check ERB tag usage for loops
Using <%= %>each, which is the original array, not the loop content.
Step 2: Correct loop tag usage
Use <% %> for loops to run code without output, then use <%= %> inside for each message.
Final Answer:
Using <%= %> for the loop causes output of the array, not the messages -> Option C
Quick Check:
Use <% %> for loops, not <%= %> [OK]
Hint: Use <% %> for loops, <%= %> for output inside loops [OK]
Common Mistakes:
Using <%= %> for loops causing wrong output
Assuming errors are empty without checking
Misunderstanding HTML tag usage inside loops
5. You want to display error messages only if there are any errors on the @comment model. Which is the best way to do this in a Rails view?
hard
A. <% if @comment.errors.any? %>
<div role='alert' aria-live='assertive'>
<ul>
<% @comment.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
B. <div>
<ul>
<% @comment.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
C. <% if @comment.errors.count > 0 %>
<p>Errors found</p>
<% end %>
D. <% unless @comment.errors.empty? %>
<p>Please fix errors</p>
<% end %>
Solution
Step 1: Check for errors presence
Use errors.any? to check if there are any errors to display.
Step 2: Display errors accessibly
Wrap errors in a div with role='alert' and aria-live='assertive' for screen readers to announce changes.
Step 3: Loop and show messages
Use full_messages inside a ul with li for each error message.
Final Answer:
Option A -> Option A
Quick Check:
Check errors.any? and use accessible alert div [OK]
Hint: Use errors.any? and role='alert' div for accessible errors [OK]
Common Mistakes:
Not checking if errors exist before displaying
Missing accessibility roles for error containers
Displaying generic messages without details
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.