Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 如何在GrapeAPI应用程序中拆分内容?_Ruby On Rails 3_Api_Grape Api - Fatal编程技术网

Ruby on rails 3 如何在GrapeAPI应用程序中拆分内容?

Ruby on rails 3 如何在GrapeAPI应用程序中拆分内容?,ruby-on-rails-3,api,grape-api,Ruby On Rails 3,Api,Grape Api,在我看到的每个示例中,人们只实现一个巨大的api.rb文件。例: 虽然这种方法可以很好地工作,但它很快就会变得拥挤,难以维护,所以我想在我的应用程序上进行拆分 例如,我想从资源中分割实体,然后在不同的文件中分割资源。例如: app - api api.rb - entities - weblog.rb - post.rb - comment.rb - resources - weblog.rb - post.rb

在我看到的每个示例中,人们只实现一个巨大的api.rb文件。例:

虽然这种方法可以很好地工作,但它很快就会变得拥挤,难以维护,所以我想在我的应用程序上进行拆分

例如,我想从资源中分割实体,然后在不同的文件中分割资源。例如:

app
 - api
   api.rb
   - entities
     - weblog.rb
     - post.rb
     - comment.rb
   - resources
     - weblog.rb
     - post.rb
     - comment.rb
现在,api.rb将类似于:

app
 - api
   api.rb
   - resources
     - post_api.rb
需要“葡萄”
模块博客
类API
app/api/entities/post.rb类似于:

app
 - api
   api.rb
   - resources
     - post_api.rb
模块博客
模块实体
类Post
app/api/resources/post.rb类似于:

app
 - api
   api.rb
   - resources
     - post_api.rb
模块博客
类APIInteger,:desc=>Post id
结束
获取“:id”do
显示Post.find(params[:id]),带有:Blog::Entities::Post
结束
结束
结束
结束
当我们这样做时,我们会遇到以下信息:

需要/blog app/api/resources/post.rb来定义post


解决方案(感谢dB.和我的同事)

您必须将结构更改为:

app
 - api
   api.rb
   - resources
     - post_api.rb
然后,在post_api.rb中

模块博客
类资源::PostAPI
最后,api.rb变成:

需要“葡萄”
模块博客
类API:路径
格式:json
mount Blog::Resources::PostAPI=>'/'
结束
结束

现在
/api/v1/posts
应该可以工作:)

post.rb中的类应该是post,而不是api。然后可以在类API中装入Post API

class API < Grape::API
  mount Blog::Post => '/'
end
class-API'/'
结束

为了避免混淆,我也会将Post放在一个资源名称空间中,或者将其重命名为PostAPI。

我发现它对路径前缀不起作用:

mount Blog::Post => '/blog'
如果希望路径具有前缀,则不起作用

使用


希望有帮助

非常感谢@dB。事实上,您必须为rails命名名称空间和重命名,以避免混淆。。。现在工作!请注意,您应该能够省略
mount
的右侧,因此只要
mount Blog::Resources::PostAPI
就可以了,无需在
/
上挂载。如果我有另一个版本的API-v2,并且我想公开不同名称的属性内容,会发生什么,因此,假设我将使用
expose:body
而不是
expose:content
,同时我还必须支持v1。我想我会开始把实体放进版本文件夹,对吗?或者,在这种设置中,您将如何处理?