Exhibit - Stel je applicatie tentoon!
Ik heb een nieuwe gem gemaakt genaamd exhibit. Het is een gem waarmee je snel en gemakkelijk presenters kunt maken voor je Rails 3 applicaties. Een presenter is een tussenstap tussen een Model en View. Hierin kun je hetgeen wat je wilt laten zien in de View op een bepaalde manier ophalen uit de Model, zonder View-logica in de Model te stoppen.
Presenters kun je op veel verschillende manieren maken. Ik heb gebruikgemaakt van de manier die in Ryan Bates zijn nieuwe Railscasts Pro aflevering genaamd ‘Presenters from Scratch’ wordt gebruikt.
Ik zal in deze Atom uitleggen hoe je gebruik kunt maken van mijn nieuwe gem.
Stel je hebt een View die er als volgt uitziet:
%p
%strong Naam
- if @user.name.present?
= @user.name
- else
%span.none Niks opgegeven
%p
%strong Website
- if @user.url.present?
link_to(@user.url, @user.url)
- else
%span.none Niks opgegeven
Je laat in deze View twee dingen over een gebruiker zien: naam en website. Als er niks is opgegeven moet er ‘Niks opgegeven’ komen te staan in een <span> tag. Je View wordt rommelig als je nog meer van dit soort informatie erin moet stoppen. Je zou alles naar een helper kunnen sturen. Je doet echter iets met de User Model en daarom is het logischer om het naar de User Model te verplaatsen. Alleen is het niet echt netjes om HTML in de Model te stoppen. Je kunt namelijk niet gebruikmaken van helpers als link_to en zou direct HTML moeten schrijven in een String. Niet handig natuurlijk. Hiervoor zijn dus ‘presenters’. Deze presenters kun je heel gemakkelijk met exhibit aanmaken.
Allereerst moet je het volgende in de Gemfile stoppen:
gem 'exhibit'
Voer nu bundle install uit en je bent klaar om presenters te genereren. Dit doe je als volgt in de Terminal:
rails g exhibit:presenter User
Nu wordt het volgende bestand aangemaakt: /app/presenters/user_presenter.rb. Hierin is alvast wat Ruby code gestopt.
class UserPresenter < Exhibit::Presenter
exhibit :user
end
We kunnen hierin methods maken die we later kunnen aanspreken in de View. Laten we een method maken om ‘Niks opgegeven’ te laten zien en om de naam en website tentoon te stellen.
class UserPresenter < Exhibit::Presenter
exhibit :user
def name
handle_none(user.name) do
user.name
end
end
def url
handle_none(user.url) do
link_to(@user.url, @user.url)
end
end
private
def handle_none(value)
if value.present?
yield
else
content_tag(:span, "Niks opgegeven", :class => "none")
end
end
end
De handle_none method zorgt ervoor dat er altijd ‘Niks opgegeven’ komt te staan als er geen waarde is opgegeven. Hiernaast hebben we een name en url aangemaakt die de naam en website op de juiste manier zal tonen. Hierin kunnen we de user method aanspreken om de gebruiker te benaderen. Dit doet de exhibit method – bovenaan de class – voor je.
We kunnen de View nu terugbrengen naar het volgende.
- exhibit(@user) do |user|
%p
%strong Naam
= user.name
%p
%strong Website
= user.url
De View is een heel stuk netter geworden. Als je een presenter wilt gebruiken met de exhibit gem, moet je de exhibit block helper gebruiken. Hieraan geef je het object mee en eventueel welke presenter je wilt gebruiken. Standaard wordt de naam van de Class gebruikt met hierna ‘Presenter’ erachter. In ons geval dus UserPresenter. Gebruik je bijvoorbeeld een PersonPresenter? Dan doe je het volgende:
- exhibit(@user, PersonPresenter) do
...
Als je een bepaalde method in de presenter simpelweg wilt doorverwijzen naar de User Model, kun je de delegate method gebruiken.
class UserPresenter < Exhibit::Presenter
exhibit :user
delegate :email, :to => :user
end
Wil je methods aanmaken die door alle presenters aangeroepen kunnen worden? Doe dan het volgende:
rails g exhibit:base
Er zal een nieuwe bestand gemaakt worden: /config/initializers/exhibit_presenter.rb. Dit is de Class waarvan alle presenters erven. Hierin kun je extra methods stoppen die door alle presenters worden gebruikt.
Wil je meer weten over presenters? Bekijk dan Railscast #286 en #287. In de tweede aflevering laat Ryan Bates zien hoe je presenters van ‘scratch’ kunt maken. Ik heb die aflevering omgezet naar de gem die ik in deze Atom heb behandeld: exhibit. Je bent nu klaar om je applicatie tentoon te stellen met exhibit. Veel plezier! :)
Geplaatst op 07/10/2011 om 08:33
Best wel tof. Ryan Bates volgt de Github repository ervan en Peter Cooper heeft de tweet erover als favoriet bestempeld. Het komt dus waarschijnlijk in Ruby Weekly. :D