Rails 6 ActiveSupport adds private option to delegated methodslevel force_ssl option
November 23, 2019
Rails 6 is recently released with a lot of features. One of them is ActiveSupport adding support for private option on delegated methods to make delegated methods not accessible publicly.
Before Rails 6, if we use delegate option for methods, it marks the delegated method publicly accessible. This could be undesirable at times if we need the delegated method to be a private method.
class Userhas_one :profiledelegate :date_of_birth, to: :profileend
Now, we can call date_of_birth on an instance of User model as given below.
user = User.first# => #<User id: 1, email: \"[email protected]\", created_at: \"2019-07-23 10:01:34\", updated_at: \"2019-08-21 06:32:57\", first_name: \"Akshay\", last_name: \"Mohite\", friendly_name: \"Akshay Mohite\">user.date_of_birth# => 29
Thus, there was no way to make delegated methods private before Rails 6.
This pull request introduces private option for the delegated methods. We can make a certain method as a private method by using this modifier as given below.
class Userhas_one :profiledelegate :date_of_birth, to: :profile, private: trueend
As we can see, we have passed
private: true To the delegate call.
Now, if we call date_of_birth method on an instance of User, it will raise a NoMethodError saying, private method date_of_birth called for user object.
NoMethodError (private method `date_of_birth\' called for #<User:0x00007ff2487906c0>)
It will be available to methods available on an instance of user as given below.
class Userhas_one :profiledelegate :date_of_birth, to: :profile, private: truedef ageDate.today.year - date_of_birth.yearendend
Now, if we call age, it will be able to call private method date_of_birth and return desired result.