

ruby初心者です。 初歩的な質問失礼します。

この記事(<http://blog.dakatsuka.jp/2011/05/27/grape.html>)を参考にrailsにgrapeをいれてAPIを作成しようとしてますが、

[code]

    /Users/masah/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:481:in `load_missing_constant': Unable to autoload constant API, expected /Users/masah/cospic/lib/api.rb to define it (LoadError)
    
[/code]

というエラーが出てきてしまいました。

どのように対処すればいいでしょうか。

lib/api.rb

[code]

    module Cospic
      class API < Grape::API
          # APIアクセスに接頭辞を付加
          # ex) http://localhost:3000/api
          prefix "api"
    
          # APIアクセスにバージョン情報を付加
          # ex) http://localhost:3000/api/v1
          version 'v1', :using => :path
    
          resource "users" do
            # ex) http://localhost:3000/api/v1/users
            desc "returns all users"
            get do
              User.all
            end
            # ex) OK: http://localhost:3000/api/v1/users/1
            # ex) NG: http://localhost:3000/api/v1/users/a
            desc "return a user"
            params do
              requires :id, type: Integer
            end
            get ':id' do
              User.find(params[:id])
            end
          end
        end
        end
    
[/code]

config/routes.rb

[code]

    Rails.application.routes.draw do
      resources :layers
      resources :posts
      resources :users
      resources :posts do
       collection do
        get 'tag'
      end
    end
    
     root 'posts#index'
    
     get '/auth/:provider/callback' => 'sessions#create' 
     get '/logout' => 'sessions#destroy' , :as => :logout
    
    
      resource :user, only: :destroy do
        get 'retire'
        end
       resources :posts,except: :index do   
      #resources :posts,except: :index do
        resources :likes, only: [:new, :create, :destroy]
    
     #collection do
      #  get 'tag/:tag_name'
      #end
      end
    
      #match '*path' => 'application#error404', via: :all
      match ':controller(/:action(/:id))', via: [ :get, :post, :patch ]
    
    end
    mount Cospic::API => "/"
    
[/code]

config/application

[code]

    require File.expand_path('../boot', __FILE__)
    require 'rails/all'
    module Cospic
    class Application < Rails::Application
    
      config.generators do |g|
        g.orm :active_record
        end
        config.i18n.default_locale = :ja
        config.autoload_paths += %W(#{config.root}/lib)
      end
    end
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2014-12-29T15:41:27.560
2804
2014-12-30T03:05:48.300
2014-12-29T23:48:56.273
3313
5891
question
ruby-on-rails grape
railsでgrapeを使用した場合” Unable to autoload constant API,〜(LoadError)”というエラー


## 1行でまとめ

`lib/api.rb`を`lib/cospic/api.rb`に移動するとうまく読み込まれると思います。

### 定数を参照すると自動で読み込まれるしくみ

元記事の方では以下のように書かれています。

[code]

    # config/initializers/api.rb
    require "#{Rails.root}/lib/api"
    
[/code]

これは明示的に`lib/api.rb`を読み込んでいるので、`lib/api.rb`に書かれた`Cospic::API`はきちんと読み込まれます。

明示的に書かない場合、Railsが定数の名前`Cospic::Api`をもとにそのファイルを読み込もうとします。
`Cospic::Api`と書いた場合、`Cospic`というネームスペースが指定されているので、`autoload_paths`の`cospic`ディレクトリ以下のファイルを読みにいきます。例えば以下のような場所のファイルです。

  * `app/models/cospic/api.rb`
  * `app/controllers/cospic/api.rb`
  * `lib/cospic/api`

なので、`lib/api.rb`を`lib/cospic/api.rb`に移動するとうまく読み込まれると思います。

定数名からどうやってロードするファイルを決めるのか、詳しい仕組みは以下のRails Guideを読んでください。 今回のケースは6.2あたりです。

[Constant Autoloading and Reloading — Ruby on Rails
Guides](http://edgeguides.rubyonrails.org/constant_autoloading_and_reloading.html)

### 余談

アプリケーション固有のコードであるなら`app`以下に置くとよいのではないでしょうか。
他のcontrollerとファイルの置き場所が混ざって気持ちが悪いなら、`app/api`ディレクトリを作って`autoload_paths`に加えれば解決します。

あと`mount Cospic::Api`を書く場所が違っているように見えます。
`mount`書くのは`Rails.application.routes.draw`の中です。

[code]

    Rails.application.routes.draw do
      mount Cospic::Api
    end
    
[/code]


CC BY-SA 3.0
2014-12-30T03:05:48.300
2812
2014-12-30T03:05:48.300
2599
2804
answer