A set of responders modules to dry up your Rails 3.2+ app.
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.
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.
Makes your create and update action redirect to the collection on success.
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
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
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 interpolation_options
{ 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."
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.
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
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-2013 Plataforma Tecnologia. http://blog.plataformatec.com.br