【问题标题】:When should you use RESTful controllers in a Rails app, and when should you not?什么时候应该在 Rails 应用程序中使用 RESTful 控制器,什么时候不应该?
【发布时间】:2009-03-25 04:42:29
【问题描述】:
我正在寻找有关何时了解模型及其关联的 RESTful 方法何时合适以及何时不合适的指南。也许这是我当前应用程序的本质,但我发现没有关联的简单模型可以很好地与 REST 配合使用,但具有许多 has_many 关联的复杂模型似乎确实使控制器中所需的视图和设置变得复杂。 form_for 调用开始变得特别复杂。
也许这是我的新手理解。我已经做 Rails 三年多了,但是 REST 和表单助手一起似乎让我很困惑。
【问题讨论】:
标签:
ruby-on-rails
ruby
rest
【解决方案1】:
为系统中的每个顶级模型创建一个资源。我所说的顶级模型是指独立的并且在关联模型之外具有意义的模型。一般来说,这是大多数模型。在以下示例中,职位和候选人是顶级的。您可以认为应聘者由 PastEmployment 和她申请的职位组成。职位申请和以前的工作经历可以通过候选人资源访问,因为它们本身并不存在。
模型
class Position
has_many :candidate_positions
has_many :candidates, :through => :candidate_positions
end
class Candidate
has_many :candidate_positions
has_many :positions, :through => :candidate_positions
has_many :past_employments
accepts_nested_attributes_for :past_employments
accepts_nested_attributes_for :candidate_positions
end
class PastEmployment
belongs_to :candidate
end
class CandidatePosition
belongs_to :candidate
belongs_to :position
end
路线
map.resources :positions
map.resources :candidates
使用非资源控制器与跨模型的用户进行交互。例如,如果您想要一个 HomeController 来显示可用职位以及最近的候选人,那将是一个新的、普通的控制器。如果您想编辑此控制器上的任何信息,很酷!您已经拥有可用于处理表单帖子的控制器,该控制器将自动与<% form_for @candidate %> 连接。您可以使用 <%= render @positions %> 渲染您的位置集合,并且因为您已将它们设为资源,Rails 会知道在 views/positions/_position.html.erb 中查找适当的部分。
最终结果应该是您永远不会编写逻辑来处理多个位置的对象的持久性。那是控制器变得复杂并且表单失控的时候。这也意味着 Rails 和外部系统知道在哪里检索和存储对象。相同的 URL,相同的控制器,只是格式不同。
【解决方案2】:
您可以查看这一系列 Railscasts,其中讨论了 REST 上下文中的 has-many 关系和表单:
【解决方案3】:
我不知道 RoR,所以我将在 REST 上生成语句。
REST 和 ROI 将 URL 视为一系列名词,并使用 GET、POST、PUT 和 DELETE 等 HTTP 方法作为动词。该模型适用于 CRUD,甚至适用于具有多个关联的模型。由于 URL 表示资源,因此关联对象可以表示为 URL 列表。
但是,如果您的系统需要更细粒度的动词,例如 validate、move、copy、honk、read、write 等,它可能不适合 REST。
【解决方案4】:
免责声明:我知道 Rails,但我还是个新手。
简短回答:REST 和表单助手是完全不同的领域。
长答案:
据我了解,Representational State Transfer 只是与表单和视图的实际呈现松散相关。
REST 确实与控制器有关,并且在一定程度上与模型有关。这个想法是,您无需考虑与客户的整个对话,而是编写一个 Web 应用程序以特定的、可预测的方式响应单个客户消息。
即,如果客户端获取模型,您只需检索它,为他们格式化,发送给他们,然后忘记它。
如果客户端发布某种更新,您更改 webapps 状态以反映这一点,发回任何响应,然后忘记它。任何未来的 GET 或 POST 都将查看新状态,而不是创建它的消息。
因此,实际上,应用程序是否为 RESTful 并不取决于模型的复杂程度,而是取决于用户如何与之交互。一个至少在某种程度上与客户端无关的应用程序,即以数据为中心的应用程序是 REST 的良好候选者。严重依赖会话、与特定用户交互并且以流程为中心的东西可能不是很好的候选者。
另一方面,您有 Rails 表单助手。这些非常适合搭建脚手架,但当您尝试以更复杂的方式使用它们时,有时可能会令人沮丧。
那么,您的主要问题是什么?您对 Rails 表单助手有什么具体问题吗?关于导轨控制器?还是特定于 REST 的东西?