Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Trailblazer Presentations @Paris.rb

Trailblazer Presentations @Paris.rb

A quick overview of Trailblazer, the missing architecture for Rails.

Sébastien Nicolaïdis

January 05, 2016
Tweet

Other Decks in Programming

Transcript

  1. TRAILBLAZER se débarasser des modèles obèses, des ifs imbriqués 


    dans les vues et les contrôleurs
 et pleins d’autres chouettes choses
  2. Les contrôleurs deviennent de simples HTTP endpoints • authentification (si

    cookies) • request format • ils délèguent directement à l’opération
  3. Voir un truc Voir un index de trucs Commenter un

    truc Editer mon dashboard Thing::Index Thing::Show Comment::Create Dashboard::Update
  4. C’est un high-level service object qui intègre (ou pas ^^)

    
 un form object, des policies, des callbacks, un model…
  5. Le Representer peut être utilisé pour les API dans un

    sens comme dans l’autre (parser ou présenter)
  6. La fin du “Rails Callback Hell” class Thing < Activerecord::Base

    after_create :notify_author! def notify_author! self.users.each do |user| if … UserMailer.existing_author(user) else UserMailer.welcome_author(user) end end end
  7. La fin du “Rails Callback Hell” form = User::Form.new(find_by(email: fragment["email"])

    or User.new) # Le user n’existe pas form.persisted? => false form.save form.persisted? => true form.created? => true # Le user existe form.persisted? => true form.save form.persisted? => true form.created? => false
  8. La fin du “Rails Callback Hell” def notify_authors! contract.users.collect do

    |user| if user.created? NewUserMailer.welcome_email(user.model) else ExistingUserMailer.added_email(user.model) end end end def process(params) validate(params[:thing]) do |f| f.save notify_authors! reset_authorships! end end
  9. La fin du “Rails Callback Hell” class Thing::Create < Trailblazer::Operation

    callback do collection :users do on_add :notify_author! on_add :reset_authorship! end on_create :expire_cache! end on_add on_create on_change
  10. class Thing < ActiveRecord::Base class Create < Trailblazer::Operation include Resolver

    policy Thing::Policy, :create? model Thing, :create builds -> (model, policy, params) do return self::Admin if policy.admin? return self::SignedIn if policy.signed_in? end ... class SignedIn < self end class Admin < SignedIn end end end
  11. it "creates valid admin" do op = Thing::Create.(thing: { name:

    "Rails" users: [{"email": "[email protected]"}] current_user: "[email protected]") thing = op.model thing.users.must_equal ["[email protected]", "[email protected]"] op.must_be_instance_of Thing::Create::Admin end
  12. Tester avec TRB On utilise les opérations comme fixtures thing

    = Thing::Create.(thing: {name: "Rails", users: [{"email": "[email protected]"}]}).model op = Thing::Create.(thing: {name: "Rails", users: [{"email": « [email protected]"}]}) res, op = Thing::Create.run(thing: {name: "Rails", users: [{"email": « [email protected] »}]}) res sera true ou false op contiendra, par exemple les erreurs ou le model on le contract…
  13. Tester avec TRB On teste à peine les contrôleurs test

    "POST /comments" do post "/comments", {comment: { body: "Awesome!" }}.to_json assert_redirect_to comment_path(operation.model) end
  14. Tester avec TRB Mais on teste à fond les opérations…

    (Voir https://github.com/apotonick/ gemgem-trbrb/blob/chapter-08/test/ concepts/thing/operation_test.rb)
  15. L’intégration des Cells avec les opérations Cell qui va bientôt

    pouvoir se passer d’ActionVieux API Hypermedia (rendering & deserialisation) Totalement découplé de Rails (Sinatra, Lotus…) L’intégration à venir avec une nouvelle gem call_sheet Pipelines in operations Dry-container integration Je n’ai pas parlé de
  16. Créons un groupe d’entraide autour de TRB https://gitter.im/sebabouche/trailblazer-paris Le meilleur

    moyen d’apprendre, c’est comme toujours de pratiquer: • Créer une GEM
 Un FormBuilder complètement découplé de Rails • Améliorer une GEM
 Tyrant (github.com/apotonick/tyrant) • Travailler sur une sample app Lotus/TRB Et maintenant ?
  17. Pour acheter le bouquin https://leanpub.com/trailblazer qui en plus d’être super

    pédagogique 
 sur pleins de concepts OOP 
 est vraiment marrant ! La dernière doc: http://trailblazer.to Chat global: https://gitter.im/trailblazer/chat