Why does trying to use Grape with Rails fail with “uninitialized constant API”?

前端 未结 3 412
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-16 04:21

I would like someone to explain why this is happening in Rails (4.1.8) with Grape (0.10.1)

so this is my API:

app/api/root.rb:

m         


        
相关标签:
3条回答
  • 2021-01-16 04:41

    I tried to put my files into app/api/api, but it wasn't working for me.

    I found a solution by simply putting the api folder into the controller folder. I'm not 100% sure what the problem was, but my guess is that it has something to do with the auto-loaded paths.

    0 讨论(0)
  • 2021-01-16 04:51

    It's because app/api is the top-level folder for your API classes, not app.

    From Grape's documentation:

    Place API files into app/api. Rails expects a subdirectory that matches the name of the Ruby module and a file name that matches the name of the class. In our example, the file name location and directory for Twitter::API should be app/api/twitter/api.rb.

    Therefore the correct location for an API::Root class would actually be app/api/api/root.rb, not /app/api/root.rb—though that is the correct location for a class in the top-level namespace, which is why the second example you give (with classes removed from the API module) works.

    I recommend you keep your API classes together in their own module, though, and move them to a matching subfolder beneath app/api.

    0 讨论(0)
  • 2021-01-16 04:51

    From Grape's documentation:

    For Rails versions greater than 6.0.0.beta2, Zeitwerk autoloader is the default for CRuby. By default Zeitwerk inflects api as Api instead of API. To make our example work, you need to uncomment the lines at the bottom of config/initializers/inflections.rb, and add API as an acronym:

    ActiveSupport::Inflector.inflections(:en) do |inflect|
      inflect.acronym 'API'
    end
    
    0 讨论(0)
提交回复
热议问题