While working on an example Rails application for the new Trailblazer tutorial series I figured out that trailblazer-rails
is quite inconvenient to use when you need to customize calls.
Controller-wide cells options
When using the Cells gem for rendering views along with a layout cell, you formerly had to pass the :layout
option manually in every controller action.
class SongsController < ApplicationController
def new
# ...
render cell(Song::Cell::New, ctx, layout: App::Cell::Layout)
end
People started monkey-patching internal methods from trailblazer-rails
to get the layout (and other options) automatically injected into every #cell
call.
This is built-in now, just define #options_for_cell
on the controller.
class SongsController < ApplicationController
private def options_for_cell(model, options)
{
layout: App::Cell::Layout
}
end
The hash returned from this method is passed as a defaults hash to #cell
. It's documented, too!
Runtime variables for operations
Another clumsiness I noticed was that it's impossible to inject variables into the operation context when using #run
. You can simply provide those as keyword arguments now.
class SongsController < ApplicationController
def create
run Song::Operation::Create,
current_user: current_user, cookie: session do |ctx|
# ...
end
This will add :current_user and :cookie to the ctx passed into the Song::Operation::Create operation. Here are the docs.
Trailblazer-Rails docs moved!
In the process of the refactoring we also rewrote trailblazer-rails
docs. The old docs are still available on the old website. Why would you need them, though, with new docs waiting here?
The new gem version is 2.2.0. 🔥
Top comments (0)