Grape 搭配 Swagger 一直吐404


#1

在觀看JC大的Grape教學時弄的
一樣將swagger-ui自己clone下來放在public

但是去點開 http://localhost:3000/swagger時 都跑出404 not found的頁面

包括我自己新增一個home的controller想說首頁弄個api列表好了,像這樣

routes.rb
root 'home#index'

然後點開localhost:3000也是404 not found.
好像只有grape裡面定義到的path可以找到一樣

我仿照官網的example放了最簡單的code

#app/api/twitter/api/api.rb

require 'grape'
require 'grape-swagger'

module Twitter
  class API < Grape::API

format :json
prefix :api
add_swagger_documentation

resource :statuses do
    desc 'Return a public timeline.'

    get :public_timeline do
        Status.limit(20)
       end
   end
  end
end

#2

找到問題了
我依照Grape官方的文件上寫說


要用ActiveRecord without Rails的話

必須在config.ru加入

use ActiveRecord::ConnectionAdapters::ConnectionManagement

run Twitter::API

然後我把 run Twitter::API去掉後,就可以看到其它頁面而不會一直吐404了
有大大知道這是什麼原因嗎?


#3

ActiveRecord without Rails 的意思是你自己寫一支 ruby 檔,引入 ActiveRecord,設定好資料庫連線,和 Rails 無關的狀況下才會需要使用,類似這篇寫的

Grape 其實是用 rack 的架構,config.ru 就是 rack 的起始點就是了,基本上你應該一開始就寫錯了才是?

而我之前的教學應該是用 Rails 建出來的,然而如果你已經建構在 Rails 上但是試不出來…應該代表你沒照官方的來做唄|||

其實官方寫得很清楚就是了,然而官方只有寫 Grape 而沒有寫 Swagger 介接的方式, Swagger 只是一個 doc + Swagger UI 的 web 介面而已,和 Grape 都無關,所以都要自幹才行(其實就是引入 JavaScript / CSS,用 Grape 產出 Swagger 的 doc,讓Swagger UI 吃到該份 doc),你沒有 /swagger 這個頁面非常正常,因為你要自己寫網頁的啊 …,而 Rails 不就是增加 route / controller / view 或是單純的在 public 增加另外一份 HTML 就可以達到目的了咪?


#4

痾痾痾痾 我誤會他的意思了 我以為要用ActiveRecord就要加入那些
所以我一開始就寫錯了…

但我上面的意思是說,即便我放了檔案在public
只要加上了 run Twitter::APIconfig.ru 就會跑出404,even我放了html檔案在public


#5

…因為那行你也不用加啊…那行是要用成 Rack application 也就是純 rack 的應用,純的 rack + Grape 是不支援靜態檔案的, 且 Rails + Grape 不需要那行哩

Grape 如果建在 Rails 下,請視為 Rails 的附屬功能,所以 Rails 要能動才可以,而不是一直測 Grape 結果 Rails 死光光唄|||

rack 是一個累積的過程,而 config.ru 可以看成開機程式,寫在前面會先執行,所以你先執行了 Grape 它就會一直開著(變成一個服務),反而後面的 Rails 就不會執行,所以通常不會在 Rails 的 config.ru 增加東西就是了


#6

原來如此 感謝解答
還真的是我的心境啊!一直測Grape 結果開回Rails一直爆…