Lessons from a life of startups, coding, countryside, and kids
You’ve probably seen deprecation warnings in Rails, especially if you made the jump to 5.2 recently, but did you know you can use them in your own app?
I suspected so but hadn’t done it before. Here’s a Rails model with a
# == Schema Information # # Table name: memberships # # id :integer not null, primary key # ...snip... # url :string indexed # class Membership < ApplicationRecord # ...snip... def url=(url) super(url.try(:downcase)) end end
That url attribute is going away to be replaced by a different mechanism based around a
url is used in lots of places, throughout the app, and it’s a pretty hard attribute to search for.
Now, in this instance, I can do something like
class Membership < ApplicationRecord alias url= path= end
to forward all calls to
url= to the
The downside is the
Membership#url will continue to proliferate through the codebase. You’ve deferred the problem but you haven’t solved it.
It’s actually pretty easy to make use of the Rails deprecation functionality.
class Membership < ApplicationRecord def url=(url) super(url.try(:downcase)) end deprecate :url= end
membership.url = 'test' # DEPRECATION WARNING: url= is deprecated and will be removed from Rails 6.0 (called from block (4 levels) in <main> at /Users/jamie/projects/podia/spec/models/membership_spec.rb:93
The method still works but a deprecation warning is printed. Except… it talks about Rails 6.0 which is not our app.
We can pass a custom deprecator to the
class Membership < ApplicationRecord def url=(url) super(url.try(:downcase)) end custom_deprecator = ActiveSupport::Deprecation.new('my-future-cleanup branch', 'Podia') deprecate :url, :url=, deprecator: custom_deprecator end
membership.url = 'test' # DEPRECATION WARNING: url= is deprecated and will be removed from Podia my-future-cleanup branch (called from block (4 levels) in <main> at /Users/jamie/projects/podia/spec/models/membership_spec.rb:93