2012-02-08 42 views
1

我正在计划一个系统,需要在许多本地Rails应用程序之间进行协作。该设计要求全球应用程序在这些服务器之间传递RESTful请求。Rails中的分布式资源

例如,假设每个学校都有一个本地的Rails应用程序,包括一个教师资源。我提出了一个全球性的应用程序,提供教师的访问权限:/ school/42/teacher/3

全球服务器上的学校资源有一个用于每个学校的应用程序的基本URL的字段,请求school_42_url/teacher/3。

该设计要求中继,而不是让学校服务器直接相互连接。

我可以想出几种方法来实现这一点,但是,对于Rails来说,新手并不能确定哪一种方法是“Rails方式”。

  1. ActiveResource很吸引人,但似乎需要一个固定的“站点”而不是为每个请求设置它。

  2. 路由,也许与URL globbing可能工作,但我需要看到一个如何实现这个例子。

  3. 第三种方法是自定义控制器,但这不像Rails的方式。

需要明确的是,{学校ID,teacher_id}的组合是全球唯一的,但全球服务器不需要存储教师的细节,那些被视为网络资源。

意见或建议欢迎。

回答

2

你应该在你的客户端应用上使用rails RESTful体系结构来暴露apis(xml,json)和一些类似Net::HTTP的库来从你的服务器(主)应用调用这些apis。

+0

这感觉就像探索的正确方向。本地服务器上的RESTful API是给定的。我会研究Net :: HTTP。 全球/学校/ 42 /老师/ 3应该在什么水平上进行分析?需要进行AR查找才能获得Schools.find(42).url,然后将该呼叫转接到该URL处的/ teacher/3。我会尝试一个控制器来处理学校的无路由呼叫。如果设置类似 的路线匹配'school /:school_id/* resource'=>'SchoolDelegate#delegate' 然后实现#delegate以使用Net :: HTTP,我是否在正确的轨道上? – Zaq 2012-02-08 05:08:03

+0

您应该查看The Rails 3 Way的[REST chapter](http://my.safaribooksonline.com/book/web-development/ruby/9780132480345/rest-resources-and-rails/ch03#X2ludGVybmFsX0ZsYXNoUmVhZGVyP3htbGlkPTk3ODAxMzI0ODAzNDUvNTU=) – rudolph9 2012-02-08 06:24:41

+0

我已经取得了一些进展...我上面提到的路线正在工作,我正在实施一个委托方法,它已经构建了正确的URI来传递给(通过id查找学校以获取正确的基础),现在可以使用网:: HTTP。下一步是编写将方法和主体复制到HTTP调用的代码。这感觉应该更容易。我应该在我的委托上创建获取,放置,发布,删除方法并路由到这些方法,而不是试图在单一方法中完成所有操作? – Zaq 2012-02-08 06:43:30

0

听起来像Pow可能是你要找的。它允许您通过符号链接为堆栈和rails应用程序配置URL。它非常适合rails模型,并且可以允许您在指定的庄园中构建独立的RESTful应用程序。我知道他们是让独立的rails服务器一起工作的方法,但是基于这种方法是一种非常低的开销方法,可能是至少用于测试和开发目的的方法。

+0

感谢您的快速响应。每个“学校”都有自己的应用程序,可以访问本地资源,但问题是关于全球应用程序的实施,可能是由Heroku托管的。我不确定在这种情况下如何助攻。如果学校应用程序与全球应用程序共处一处,那么将单个ActiveRecord用于“教师”会更有意义,并且不会出现跨应用程序通信的需求。 – Zaq 2012-02-08 04:32:34

+0

它允许您在开发过程中通过独立地址通过REST进行通信来模拟每个应用程序,但有可能没有它,但它是一个很好的开发工具。至于部署在Heroku上,部署后你会相应地更新地址。我不相信跨多轨应用程序共享ActiveRecord是可能的。一个通用的数据库,绝对是单个常见的ActiveRecord,跨多个独立的rails应用程序。 – rudolph9 2012-02-08 06:19:42

+0

感谢您的帮助Kurt。在这种情况下,单一数据库不是正确的方法,但在某种程度上,它应该感觉它是单一的。大多数应用程序将在“学校”内运行,但偶尔会有互动......想象一下,老师正在参观一所不同的学校。 REST为我提供了一种简洁的方式来描述资源,而无需参考特定的实现。我仍然认为ActiveResource是正确的抽象类型,但它是基于单个固定资源的假设。你今天教过我一些东西,我感谢你的意见。 – Zaq 2012-02-08 06:51:04