Using puts in rails
Categories:
Mastering puts
in Ruby on Rails: Debugging and Beyond

Explore the versatile puts
method in Ruby on Rails for effective debugging, understanding execution flow, and temporary output, along with best practices and alternatives.
In the world of Ruby on Rails development, puts
is often the first and most straightforward tool developers reach for when they need to inspect variables, understand program flow, or simply print information to the console. While seemingly basic, mastering its use, understanding its limitations, and knowing when to use alternatives can significantly enhance your debugging efficiency and code quality. This article delves into the various ways puts
can be leveraged in a Rails application, from controllers and models to views and background jobs, and introduces more robust debugging techniques.
The Basics of puts
in Rails
The puts
method (short for "put string") is a fundamental Ruby function that prints its arguments to the standard output, typically your console or terminal. In a Rails application, where this output appears depends on where your Rails server is running. If you're using rails server
in your terminal, the output will appear directly in that terminal window. If you're running tests, it will appear in the test output. It's a quick and dirty way to get immediate feedback on your code's state.
# In a controller action
class ArticlesController < ApplicationController
def show
@article = Article.find(params[:id])
puts "--- Article ID: #{@article.id} ---"
puts "--- Article Title: #{@article.title} ---"
end
end
# In a model callback
class User < ApplicationRecord
after_create :log_creation
private
def log_creation
puts "--- New user created: #{self.email} ---"
end
end
# In a view (though generally discouraged)
<!-- app/views/articles/show.html.erb -->
<p>Article Title: <%= @article.title %></p>
<% puts "--- Rendering article view for ID: #{@article.id} ---" %>
Examples of using puts
in different parts of a Rails application.
puts
in views, remember that the output will appear in your server console, not in the browser's developer console. For client-side debugging, you'll need to use JavaScript's console.log()
.Understanding puts
Output Flow
The output of puts
is directed to STDOUT
(standard output). In a typical Rails development setup, this means your terminal where the rails server
process is running. When your application is deployed, the puts
output will usually go to the application's logs, which might be streamed to a logging service or written to a file, depending on your server configuration (e.g., Puma, Passenger, Unicorn). Understanding this flow is crucial for effective debugging, especially in production environments where direct terminal access might not be available.
flowchart TD A[Rails Application] --> B{`puts` call} B --> C[Standard Output (STDOUT)] C --> D{Development Environment} C --> E{Production Environment} D --> F[Terminal/Console] E --> G[Application Logs] G --> H[Log File/Logging Service] F -- "Immediate Feedback" --> I[Developer] H -- "Post-mortem Analysis" --> I
Flow of puts
output in Rails development and production environments.
When to Use puts
and When to Choose Alternatives
puts
is excellent for quick, temporary debugging. It's lightweight and requires no special setup. However, for more complex scenarios, or for production logging, it falls short. Rails provides more sophisticated tools that offer better context, filtering, and persistence.
puts
statements in production code. They can clutter logs, potentially expose sensitive information, and slightly impact performance. Always clean them up before deploying.Here's a comparison of puts
with other common debugging and logging tools in Rails:
Logger
In a controller or model
Rails.logger.debug "Debugging info: #{some_variable}" Rails.logger.info "Informational message: User logged in." Rails.logger.warn "Warning: Deprecated feature used." Rails.logger.error "Error: Failed to save record."
Benefits:
- Configurable log levels (debug, info, warn, error, fatal)
- Output goes to log/development.log
(or other configured files)
- Better for production logging and filtering.
byebug/pry-byebug
In your Gemfile
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
or for more features:
gem 'pry-byebug'
In your code
def some_method variable_a = 'value' byebug # or binding.pry variable_b = 'another_value' end
Benefits:
- Pauses execution, allowing interactive inspection of variables.
- Step through code line by line.
- Set breakpoints, evaluate expressions.
- Essential for complex debugging scenarios.
inspect / pp
Using inspect
puts some_object.inspect
Using pp
(pretty print) for complex objects
require 'pp' pp some_complex_hash
Benefits:
- inspect
provides a more detailed, developer-friendly string representation of an object than to_s
.
- pp
formats complex data structures (hashes, arrays) for readability.
- Still outputs to STDOUT, similar to puts
, but with better object representation.
Practical Debugging Steps with puts
While puts
should be used judiciously, it remains a powerful tool for quick checks. Here are some common scenarios where it shines:
1. Verify Parameter Values
Place puts params.inspect
at the beginning of a controller action to see what data is being received from a form submission or API request.
2. Check Variable States
Insert puts "Variable value: #{my_variable}"
at different points in a method to track how a variable changes throughout its execution.
3. Confirm Method Execution
Use puts "--- Method X started ---"
and puts "--- Method X finished ---"
to confirm if a specific method is being called and completed as expected.
4. Inspect Query Results
After a database query, use puts @records.count
or puts @records.map(&:id)
to quickly verify the number of records or their identifiers.
5. Debug Conditional Logic
Inside if/else
blocks, add puts
statements like puts "--- Inside IF block ---"
to confirm which branch of logic is being executed.