问题
I have a new rails 6 application and in the lib folder I had this:
/lib/some_app_name/stripe/subscription/subscription_service.rb
module Someappname # Someappname is also in my application.rb
module Stripe
class SubscriptionService
def initialize(a)
@a = a
end
end
end
end
I then moved the 'some_app_name' folder to:
/app/some_app_name/stripe/subscription_service.rb
I read that anything inside of /app will be autoloaded and reloaded so I moved in here. It wasn't working in /lib also.
In my home_controller.rb I tried this:
ss = Someappname::Stripe::SubscriptionService.new("a")
I get an error saying:
uninitialized constant Someappname::Stripe::SubscriptionService
What am I doing wrong here?
回答1:
I suspect it's spring
, try this
bin/spring stop
And then start rails console
, stopping Spring will force Rails
to load your app fresh
Also,
if the name of your module is Someappname
, then the directory name should be app/someappname
and not some_app_name
Hope that helps!
回答2:
Rails does auto-load everything under /app
, but there's a caveat. First level of directories is not becoming a part of module name. That's why you can have class User
in /app/models/user.rb
(and not class Models::User
).
Solution: place your code into some folder under /app
. I usually call it /app/lib
or /app/custom
or something like that.
/app/custom/some_app_name/stripe/subscription/subscription_service.rb
(and yes, make sure that names in your filepath correctly represent names in your module path. You can't have directory some_app_name
for module Someappname
, but you can for SomeAppName
)
来源:https://stackoverflow.com/questions/58681673/i-moved-my-folder-from-lib-to-app-in-a-rails-6-i-cant-seem-to-instantiate-an