
Security News
CISA’s 2025 SBOM Guidance Adds Hashes, Licenses, Tool Metadata, and Context
CISA’s 2025 draft SBOM guidance adds new fields like hashes, licenses, and tool metadata to make software inventories more actionable.
http://www.brianpearce.ca/images/garnish.png
{}[http://travis-ci.org/brianp/garnish] {
}[https://codeclimate.com/github/brianp/garnish]
RDocs[http://rdoc.info/projects/brianp/garnish]
Garnish is a Presenter / Decorator pattern for models in Rails. It gives a home to presentation level view logic that normally litters helpers and view files. Using it can help you:
== Requirements
Garnish Has been tested with
== Installation
In Rails 3, add this to your Gemfile and run the +bundle+ command.
gem "garnish"
== Getting Started
A lot of magic happens with Garnish in an attempt to make things incredibly simple for you.
=== 1. Define You Presenters (Generators coming soon!)
Create a folder in app/ called presenters. ex app/presenters/
Create a presenter matching the name of your model in your presenters folder. ex app/presenters/user_presenter.rb
Define the user_presenter
module UserPresenter include Garnish::Presenter end
=== 2. Add methods to your presenter
Define methods in your presenter as regular instance methods
module UserPresenter include Garnish::Presenter
def greeting
if last_login.nil?
"Welcome #{name}, can we offer you a tour?"
else
"Welcome back #{name}"
end
end
end
=== 3. Add the garnish call
In app/controllers/application_controller.rb add the garnish call.
class ApplicationController < ActionController::Base protect_from_forgery
garnish
end
Or If you don't want to use Garnish application wide simply add the call into a specific controller.
=== 4. Use respond_with
The only change you need to make to start using your presenters now is to use respond_with inside any controller that has been garnished
app/controllers/user_controller.rb
def show @user = User.find(params[:id])
respond_with @user do |format|
format.html # show.html.erb
end
end
Garnish will now find and load presenters for any instance variables you set inside your action. NOT just the ivar passed to the respond_with block.
=== 5. Start using your presenter methods
app/views/users/show.html.erb
<%= @user.greeting %>
== View Helpers
Garnish plays very nicely when adding view helper methods into your presenter. Just treat them like a regular method.
module UserPresenter include Garnish::Presenter
def profile_pic
image_tag profile_pic unless profile_pic.nil?
end
end
== Relationships
The real reason I got down to business. If I'm using presenters in my views I probably have presenters for multiple objects.
class User < ActiveRecord::Base has_many :items end
class Item < ActiveRecord::Base belongs_to :user end
Assuming I have presenters for both of these models
module UserPresenter include Garnish::Presenter end
module ItemPresenter include Garnish::Presenter
def picture
image_tag profile_pic unless profile_pic.nil?
end
end
In my view when I'm accessing a user's items via the association what I really want is an Item extended with presenter methods not just a regular item.
Garnish handles this for us. Anytime a relationship is accessed on a garnished resource the returned resources will also be extended with their presenter methods.
<%= @user.items.first.picture %>
Works with no effort what so ever.
== Questions or Problems?
If you have any issues with Garnish which you cannot find the solution to, please add an {issue on GitHub}[https://github.com/brianp/garnish/issues] or fork the project and send a pull request.
To get the specs running you should call +bundle+ and then +rake+. See the {spec/README}[https://github.com/brianp/garnish/blob/master/spec/README.rdoc] for more information.
== Special Thanks
{Fraser Valley Ruby Brigade}[http://www.fvrb.org/]
The Ruby Moguls
Garnish was inspired by draper[https://github.com/jcasimir/draper/] and the RailsCast Pro episode #287 Presenters from Scratch. See the CHANGELOG[https://github.com/brianp/garnish/blob/master/CHANGELOG.rdoc] for the full list.
FAQs
Unknown package
We found that garnish demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
CISA’s 2025 draft SBOM guidance adds new fields like hashes, licenses, and tool metadata to make software inventories more actionable.
Security News
A clarification on our recent research investigating 60 malicious Ruby gems.
Security News
ESLint now supports parallel linting with a new --concurrency flag, delivering major speed gains and closing a 10-year-old feature request.