-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support code reloading when configuring static preferences sources #4449
Support code reloading when configuring static preferences sources #4449
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Approved assuming specs fails for a different reason. I think this is an important change that we should highlight in the Changelog.
Good point! I updated the Changelog accordingly. |
This is how we usually recommend configuring sources for static preferences [1]: ```ruby Spree.config do |config| config.static_model_preferences.add( AmazingStore::AmazingPaymentMethod, 'amazing_payment_method_credentials', credentials: ENV['AMAZING_PAYMENT_METHOD_CREDENTIALS'], server: Rails.env.production? ? 'production' : 'test', test_mode: !Rails.env.production? ) end ``` However, it's no longer possible to directly reference an autoloadable class from an initializer [2]. In this case, we can't change the `#add` method to take the class name instead. The reason is that it ends up invoking a sanitization check on the given preferences against the defined preferences, and that, of course, needs access to the actual class [3]. Therefore, it's better to start recommending nesting the configuration within a `.to_prepare` block, as they run every time the code is reloaded [4]: ```ruby Rails.application.config.to_prepare do Spree::Config.static_model_preferences.add( AmazingStore::AmazingPaymentMethod, 'amazing_payment_method_credentials', credentials: ENV['AMAZING_PAYMENT_METHOD_CREDENTIALS'], server: Rails.env.production? ? 'production' : 'test', test_mode: !Rails.env.production? ) end ``` However, that means running the `#add` method multiple times, so we need to change it to replace the definition instead of raising an error. [1] - https://github.com/solidusio/solidus_stripe/blob/3fab36511a9d02ebd64d03571704ac5a9031b63b/README.md#usage [2] - https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-on-boot-and-on-each-reload [3] - https://github.com/solidusio/solidus/blob/df51df62fa9b829216958b21b20514b7a3d87b30/core/lib/spree/preferences/static_model_preferences.rb#L13 [4] - https://guides.rubyonrails.org/configuring.html#initialization-events Closes solidusio#4070 & solidusio#4040
We rearrange the CHANGELOG to accommodate the increased amount of information.
27beeac
to
c9562c6
Compare
This is needed in Rails 7 [1] and latest Solidus was adapted to support it. See solidusio/solidus#4449 [1] - https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-on-boot-and-on-each-reload
This is needed in Rails 7 [1] and latest Solidus was adapted to support it. See solidusio/solidus#4449 [1] - https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-on-boot-and-on-each-reload
This is how we usually recommend configuring sources for static
preferences:
However, it's no longer possible to directly reference an autoloadable
class from an initializer.
In this case, we can't change the
#add
method to take the class nameinstead. The reason is that it ends up invoking a sanitization check on
the given preferences against the defined preferences, and that, of
course, needs access to the actual class.
Therefore, it's better to start recommending nesting the configuration
within a
.to_prepare
block, as they run every time the code isreloaded:
However, that means running the
#add
method multiple times, so we needto change it to replace the definition instead of raising an error.
Closes #4070 & #4040