1

我有两个类“Person”和“Group”,它们是通过 Rails Single Table Inheritance 模式从基类“Entity”派生的。这种模式已经干掉了我的很多代码。

实体本身没有关系(例如 has_many),但 Person 和 Group 有其特定的关系。

继续简化我的代码的过程,对个人或组对象的任何更改都将针对 /entities/:id 进行 PUT,从而触发更新操作。

输入问题:Rails 使用 attr_accessible 和类必须构建 params[:entity] 对象的关系。由于我可能 PUT 的某些东西(比如 operator_attributes,特定于 Group)只出现在 Group 而不是 Entity 中,Rails 不将这些包含在 params[:entity] 中。

如何在仍然使用实体控制器且无需重写 Rails 逻辑来构建 params[:entity] 的情况下解决此问题?

4

2 回答 2

0

我遇到了同样的问题。我的子类模型表现得非常不同,以至于我最终创建了瘦控制器来配合我的瘦模型。他们每个人都有不同的验证要求。我不能只创建一个通用 Entity 对象并typePUT. 我必须创建正确的对象。

显然,这不像你想要的那样干燥,也不适合我。但就我而言,我仍然在管理面板中使用实体控制器/模型,这样我就可以显示条目并进行基本报告。在面向用户的方面,它们是分开的,实体受到保护。它们用于不同的上下文,具有不同的逻辑和视图。所以对我来说,为每个子类模型使用单独的控制器和视图最终是正确的决定。

STI 为我做的主要事情是干燥我的数据库和模型。如果继承的模型以相同的方式表现和显示,那么干起来就变得更容易了。希望这在某种程度上有所帮助。

于 2012-11-07T23:25:02.863 回答
0

我最终通过禁用 EntityController 的 wrap_parameters 并在客户端的原始 PUT 请求中创建根实体键来解决这个问题。

如果模型上存在方法“attribute_names”,它会调用它,所以我想基本实体模型可以使用 .constantize() 或其他一些方法来确定正确执行的操作。

最好的解决方案是让 wrap_parameters 以编程方式重新初始化 params 哈希。看起来这几乎是可能的:您可以更改 wrap_parameters 但我还没有弄清楚如何重新处理参数。

请参阅:http ://edgeapi.rubyonrails.org/classes/ActionController/ParamsWrapper.html#method-i-process_action

于 2012-11-08T01:10:09.490 回答