Controllers
Helpers
Templates
Too many
responsibilities
Slide 23
Slide 23 text
Controllers
Helpers
Templates
Too many
responsibilities
Slide 24
Slide 24 text
Controllers
Helpers
Templates
Too many
responsibilities
Disorganised,
mostly gross
Slide 25
Slide 25 text
Controllers
Helpers
Templates
Too many
responsibilities
Disorganised,
mostly gross
Decorators?
Slide 26
Slide 26 text
Controllers
Helpers
Templates
Too many
responsibilities
Disorganised,
mostly gross
Decorators?
Friction, limited
Slide 27
Slide 27 text
Controllers
Helpers
Templates
Too many
responsibilities
Disorganised,
mostly gross
Decorators?
Friction, limited
Slide 28
Slide 28 text
Controllers
Helpers
Templates
Too many
responsibilities
Disorganised,
mostly gross
Decorators?
Friction, limited
Cluttered,
too much logic
Slide 29
Slide 29 text
It’s too hard to write
good view code
Slide 30
Slide 30 text
Good view code
Slide 31
Slide 31 text
Good view code
Slide 32
Slide 32 text
Let’s build
a better view system
Slide 33
Slide 33 text
dry-view
Slide 34
Slide 34 text
pssssst!
dry-view already exists!
This guy is just “acting”
"
Slide 35
Slide 35 text
dry-view requirements
Slide 36
Slide 36 text
dry-view requirements
• Views as objects
Slide 37
Slide 37 text
class Show < Dry::View
end
Slide 38
Slide 38 text
class Show < Dry::View
end
view = Show.new
Slide 39
Slide 39 text
class Show < Dry::View
attr_reader :article_repo
def initialize(article_repo:)
@article_repo = article_repo
end
end
view = Show.new(repo: article_repo)
Slide 40
Slide 40 text
class Show < Dry::View
attr_reader :article_repo
def initialize(article_repo:)
@article_repo = article_repo
end
end
view = Show.new(article_repo: repo)
Slide 41
Slide 41 text
dry-view requirements
• Views as objects
• Explicit template locals
Slide 42
Slide 42 text
class Show < Dry::View
config.template = "articles/show"
expose :article do |slug:|
article_repo.find_by_slug(slug)
end
end
view = Show.new(article_repo: repo)
Slide 43
Slide 43 text
class Show < Dry::View
config.template = "articles/show"
expose :article do |slug:|
article_repo.find_by_slug(slug)
end
end
view = Show.new(article_repo: repo)
Slide 44
Slide 44 text
class Show < Dry::View
config.template = "articles/show"
expose :article do |slug:|
article_repo.find_by_slug(slug)
end
end
view = Show.new(article_repo: repo)
- show_author = \
defined?(show_author) ? show_author : false
- link_prefix = \
defined?(link_prefix) ? link_prefix : "Related: "
.related-article
a href=article.url = "#{link_prefix} #{article.title}"
- if show_author
.author …
4c391850cabe4809a6b6ab1a155529…
16 March 2016
Totally wrote this code.
FIXME!
Slide 73
Slide 73 text
class Scopes::RelatedArticle < Dry::View::Scope
def show_author?
locals.fetch(:show_author, false)
end
def link_text
prefix = locals.fetch(:link_prefix, "Related:")
"#{prefix} #{article.title}”
end
end
Slide 74
Slide 74 text
class Scopes::RelatedArticle < Dry::View::Scope
def show_author?
locals.fetch(:show_author, false)
end
def link_text
prefix = locals.fetch(:link_prefix, "Related:")
"#{prefix} #{article.title}”
end
end
Slide 75
Slide 75 text
class Scopes::RelatedArticle < Dry::View::Scope
def show_author?
locals.fetch(:show_author, false)
end
def link_text
prefix = locals.fetch(:link_prefix, "Related:")
"#{prefix} #{article.title}”
end
end
Slide 76
Slide 76 text
class Scopes::RelatedArticle < Dry::View::Scope
def show_author?
locals.fetch(:show_author, false)
end
def link_text
prefix = locals.fetch(:link_prefix, "Related:")
"#{prefix} #{article.title}"
end
end
Slide 77
Slide 77 text
.related-article
a href=article.url = link_text
- if show_author?
.author …
dry-view requirements
• Views as objects
• Explicit template locals
• Simple templates
• View logic on decorated values
• View facilities are automatic
• View facilities are integrated
• View logic on specific templates
Slide 81
Slide 81 text
dry-view requirements
• Views as objects
• Explicit template locals
• Simple templates
• View logic on decorated values
• View facilities are automatic
• View facilities are integrated
• View logic on specific templates
• Common helpers
Slide 82
Slide 82 text
class Context < Dry::View::Context
def initialize(assets:, **args)
@assets = assets
super(**args)
end
def asset_path(asset_name)
@assets[asset_name]
end
end
Slide 83
Slide 83 text
class Context < Dry::View::Context
def initialize(assets:, **)
@assets = assets
super
end
def asset_path(asset_name)
@assets[asset_name]
end
end
Slide 84
Slide 84 text
class Context < Dry::View::Context
def initialize(assets:, **)
@assets = assets
super
end
def asset_path(asset_name)
@assets[asset_name]
end
end