I would love to see the ability to define custom Context classes as long as they implement the proper methods (Similar to ActiveModel linting).
Reason being is that OpenStruct leaves a lot of room for error, and have a proper domain object for context would alleviate a lot of that. For example, it would be really nice to be able to do:
class AuthenticateUser
include Interactor
context_class AuthenticateUserContext
def call; end
end
class AuthenticateUserContext < Interactor::BaseContext
attr_accessor :email, :password
end
Explanation of what this example is doing:
Interactor::BaseContext would implement all of the necessary internals of a context, for example fail! and rollback!.
But since it doesn't include OpenStruct, the only values that can be set are email and password due to the attr_accessor in the custom context class.
I like this because it makes you think of your design more coherently and actually gives more options at the end of an interactor call. For example, errors:
class AuthenticateUserContext < Interactor::BaseContext
attr_accessor :email, :password
def formatted_errors
errors.map {|error_key| I18n.translate(error_key) }
end
end
I would love to see the ability to define custom Context classes as long as they implement the proper methods (Similar to ActiveModel linting).
Reason being is that OpenStruct leaves a lot of room for error, and have a proper domain object for context would alleviate a lot of that. For example, it would be really nice to be able to do:
Explanation of what this example is doing:
Interactor::BaseContextwould implement all of the necessary internals of a context, for examplefail!androllback!.But since it doesn't include
OpenStruct, the only values that can be set areemailandpassworddue to theattr_accessorin the custom context class.I like this because it makes you think of your design more coherently and actually gives more options at the end of an interactor call. For example, errors: