Responders
A set of responders modules to dry up your Rails 3.2+ app.
Responders Types
FlashResponder
Sets the flash based on the controller action and resource status.
For instance, if you do: respond_with(@post)
on a POST request and the resource @post
does not contain errors, it will automatically set the flash message to
"Post was successfully created"
as long as you configure your I18n file:
flash:
actions:
create:
notice: "%{resource_name} was successfully created."
update:
notice: "%{resource_name} was successfully updated."
destroy:
notice: "%{resource_name} was successfully destroyed."
alert: "%{resource_name} could not be destroyed."
In case the resource contains errors, you should use the failure key on I18n. This is
useful to dry up flash messages from your controllers. Note: by default alerts for update
and destroy
actions are commented in generated I18n file. If you need a specific message
for a controller, let's say, for PostsController
, you can also do:
flash:
posts:
create:
notice: "Your post was created and will be published soon"
This responder is activated in all non get requests. By default it will use the keys
:notice
and :alert
, but they can be changed in your application:
config.responders.flash_keys = [ :success, :failure ]
You can also have embedded HTML. Just create a _html
scope.
flash:
actions:
create:
alert_html: "<strong>OH NOES!</strong> You did it wrong!"
posts:
create:
notice_html: "<strong>Yay!</strong> You did it!"
See also the namespace_lookup
option to search the full hierarchy of possible keys.
LocationResponder
This responder allows you to use callable objects as the redirect location.
Useful when you want to use the respond_with
method with
a custom route that requires persisted objects, but the validation may fail.
class ThingsController < ApplicationController
responders :location, :flash
respond_to :html
def create
@thing = Thing.create(params[:thing])
respond_with @thing, location: -> { thing_path(@thing) }
end
end
HttpCacheResponder
Automatically adds Last-Modified headers to API requests. This allows clients to easily query the server if a resource changed and if the client tries to retrieve a resource that has not been modified, it returns not_modified status.
CollectionResponder
Makes your create and update action redirect to the collection on success.
Configuring your own responder
The first step is to install the responders gem and configure it in your application:
gem install responders
In your Gemfile, add this line:
gem 'responders'
Responders only provides a set of modules, to use them, you have to create your own responder. This can be done inside the lib folder for example:
# lib/app_responder.rb
class AppResponder < ActionController::Responder
include Responders::FlashResponder
include Responders::HttpCacheResponder
end
And then you need to configure your application to use it:
# app/controllers/application_controller.rb
require "app_responder"
class ApplicationController < ActionController::Base
self.responder = AppResponder
respond_to :html
end
Or, for your convenience, just do:
rails generate responders:install
Controller method
This gem also includes the controller method responders
, which allows you to cherry-pick which
responders you want included in your controller.
class InvitationsController < ApplicationController
responders :flash, :http_cache
end
Interpolation Options
You can pass in extra interpolation options for the translation by adding an interpolation_options
method to your controller:
class InvitationsController < ApplicationController
responders :flash, :http_cache
def create
@invitation = Invitation.create(params[:invitation])
respond_with @invitation
end
private
def
{ resource_name: @invitation.email }
end
end
Now you would see the message "[email protected] was successfully created" instead of the default "Invitation was successfully created."
Generator
This gem also includes a responders controller generator, so your scaffold can be customized
to use respond_with
instead of default respond_to
blocks. Installing this gem automatically
sets the generator.
Examples
Want more examples ? Check out this blog posts:
- One in Three: Inherited Resources, Has Scope and Responders
- Embracing REST with mind, body and soul
- Three reasons to love ActionController::Responder
- My five favorite things about Rails 3
Bugs and Feedback
If you discover any bugs or want to drop a line, feel free to create an issue on GitHub.
http://github.com/plataformatec/responders/issues
MIT License. Copyright 2009-2014 Plataforma Tecnologia. http://blog.plataformatec.com.br