Trailblazer::Rails
Last updated 05 January 2017 trailblazer-rails v1.0Trailblazer in your Rails controllers. The trailblazer-rails gem adds #run and render cell(Constant) to your controllers.
This documents the version compatible with Trailblazer 2.0.
Installation
Add the gem to your Gemfile.
gem "trailblazer-rails"
This will automatically pull trailblazer and trailblazer-loader.
Railtie
The Trailblazer::Rails::Railtie will activate all necessary convenience methods for you. You don’t have to do anything manually here. Sit back and relax.
Run
In a controller, you could simply invoke an operation manually.
class SongsController < ApplicationController
def create
result = Song::Create.(params)
@form = result["contract.default"]
render :new
end
end
Trailblazer-Rails gives you run for this to simplify the task.
class SongsController < ApplicationController
def create
run Song::Create
render :new
end
end
run passes the controller’s params hash into the operation call. It automatically assigns @model and, if available, @form for you.
The result object is returned.
def create
result = run Song::Create
result["model"] #=> #<Song title=...>
render :new
end
The result object is also assigned to @_result.
Run: With Block
To handle success and failure cases, run accepts an optional block.
class SongsController < ApplicationController
def create
run Song::Create do |result|
return redirect_to song_path(result["model"].id)
end
render :new
end
end
The block is only run for success?. The block argument is the operation’s result.
Runtime Options
It’s clever to inject runtime dependencies such as current_user into the operation call.
Song::Create.( params, "current_user" => current_user )
Override #_run_options to do that automatically for all run calls.
class ApplicationController < ActionController::Base
private
def _run_options(options)
options.merge( "current_user" => current_user )
end
end
Render
The gem extends ActionController#render and now allows to render a Trailblazer::Cell.
class SongsController < ApplicationController
def create
run Song::Create do |result|
return redirect_to song_path(result["model"].id)
end
render cell(Song::Cell::New, @model)
end
end
You simply invoke cell the way you did it before, and pass it to render. Per default, render will add layout: true to render the ActionView layout. It can be turned off using layout: false.
As always, the cell method also accepts options.
render cell(Song::Cell::New, @model, action_name: params[:action])
All arguments after cell are simply passed through to Rails’ render.
render cell(Song::Cell::New, @model, action_name: params[:action]), layout: false
Use result to pass the result object to the cell.
render cell(Song::Cell::New, result)
If the first argument to render is not a cell instance, the original Rails render version will be run.
Integration Test
If you’re using Minitest::Spec and want to run smoke tests using Capybara, use Trailblazer::Test::Integration.
You need to add minitest-rails-capybara to your Gemfile.
group :test do
gem "minitest-rails-capybara"
end
Your tests can now use Capybara matchers.
require "test_helper"
class SongsControllerTest < Trailblazer::Test::Integration
it do
visit "/songs/new"
page.must_have_css "form[action='/songs']"
end
end
Configuration
Configuration: ApplicationController
Trailblazer-rails will extend ::ApplicationController per default. Use trailblazer.application_controller to change this, should your code use a different base controller class.
# config/initializers/trailblazer.rb
Rails.application.config.trailblazer.application_controller = "MyApp::BaseController"
Note that the value is a string that gets constantized at runtime.
