处理铁路中 STI 子类路线的最佳实践

2024-05-20

我的 Rails 视图和控制器散布着redirect_to, link_to, and form_for方法调用。有时link_to and redirect_to它们链接的路径是明确的(例如link_to 'New Person', new_person_path),但很多时候路径是隐式的(例如link_to 'Show', person).

我向我的模型添加了一些单表继承 (STI)(例如Employee < Person),并且所有这些方法都会因子类的实例而中断(例如Employee);当 Rails 执行时link_to @person,它的错误是undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>。 Rails 正在寻找由对象的类名(employee)定义的路由。这些员工路线未定义,并且没有员工控制器,因此操作也未定义。

这个问题之前已经被问过:

  1. At 堆栈溢出 https://stackoverflow.com/questions/1773367/link-to-issue-with-inherited-active-record-class,答案是编辑整个代码库中 link_to 等的每个实例,并明确说明路径
  2. On 堆栈溢出 https://stackoverflow.com/questions/702728/get-route-for-base-class-of-sti-class-in-rails再次,有两个人建议使用routes.rb将子类资源映射到父类(map.resources :employees, :controller => 'people')。同一个 SO 问题中的最佳答案建议使用以下命令对代码库中的每个实例对象进行类型转换.becomes
  3. 还有一个在堆栈溢出 https://stackoverflow.com/questions/4432858/broken-rails-routes-after-implementing-single-table-inheritance,最重要的答案是“重复自己”阵营,并建议为每个子类创建重复的脚手架。
  4. Here's https://stackoverflow.com/questions/943300/single-table-inheritance-routing同样的问题在 SO 再次出现,其中最重要的答案似乎是错误的(Rails magic Just Works!)
  5. 在网络的其他地方,我发现这篇博文 http://strugglingwithruby.blogspot.com/2008/10/single-table-inheritance.html其中 F2Andy 建议在代码中的任意位置进行编辑。
  6. 在博客文章中单表继承和 RESTful 路由 http://blog.lrdesign.com/2009/03/single-table-inheritance-and-restful-routes/在逻辑现实设计中,建议将子类的资源映射到超类控制器,如上面的答案 2 所示。
  7. 亚历克斯·雷斯纳 有一个帖子Rails 中的单表继承 http://www.alexreisner.com/code/single-table-inheritance-in-rails,其中他主张反对将子类的资源映射到父类routes.rb,因为这只捕获路由中断link_to and redirect_to,但不是来自form_for。因此他建议向父类添加一个方法,让子类对它们的类​​撒谎。听起来不错,但他的方法给了我错误undefined local variable or method `child' for #.

所以看起来最优雅、最有共识的答案(但也不是全部)that优雅,也不that达成共识),是将资源添加到您的routes.rb。但这不适用于form_for。我需要一些澄清!为了提炼上面的选择,我的选择是

  1. 将子类的资源映射到超类的控制器routes.rb(并希望我不需要在任何子类上调用 form_for )
  2. 重写 Rails 内部方法以使类相互欺骗
  3. 编辑代码中隐式或显式调用对象操作路径的每个实例,更改路径或对对象进行类型转换。

面对所有这些相互矛盾的答案,我需要做出裁决。在我看来,似乎没有好的答案。这是 Rails 设计的失败吗?如果是这样,这是一个可以修复的错误吗?或者如果没有,那么我希望有人能直接告诉我这个问题,引导我了解每个选项的优点和缺点(或解释为什么这不是一个选项),以及哪个是正确的答案,以及为什么。或者我在网上找不到正确的答案?


这是我能想到的最简单的解决方案,副作用最小。

class Person < Contact
  def self.model_name
    Contact.model_name
  end
end

Now url_for @person将映射到contact_path正如预期的那样。

怎么运行的:URL 助手依赖YourModel.model_name反思模型并生成(其中包括)单数/复数路径键。这里Person基本上是在说我就像Contact老兄,问他吧.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理铁路中 STI 子类路线的最佳实践 的相关文章

  • 在新的 RHEL6 服务器上安装 ruby​​-filemagic gem 时遇到困难

    它似乎正在寻找 libmagic so 1 文件 我有那个文件 它位于 usr lib64 中 我没有以 root 用户身份运行此安装 我也在使用 rvm 和 Bundler 这是我的 bundle 命令的结果 当它到达 Gemfile 中
  • BigDecimal 无法强制转换为 BigDecimal

    这应该很简单 但它却爆炸了 有任何想法吗 d BigDecimal new 2 0 YAML load a gt d to yaml TypeError BigDecimal can t be coerced into BigDecimal
  • 如何使用 ruby​​ 的循环和 haml 创建表?

    我正在尝试制作一个如下所示的 html 表 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 我的数据结构是这样的 f ary 1 250 这是我的哈姆尔代码 table border gt 1 tbody tr cnt 0 f
  • Rails 中的并行方法

    我的 Rails Web 应用程序有数十种方法 从调用 API 到处理查询结果 这些方法具有以下结构 def method one batch query API process data end def method nth batch
  • 如何从数组中删除空白元素?

    我有以下数组 cities Kathmandu Pokhara Dharan Butwal 我想从数组中删除空白元素并想要以下结果 cities Kathmandu Pokhara Dharan Butwal 有没有类似的方法compact
  • 使用 Ruby 获取 AWS 区域名称

    我正在为 AWS 开发 Rails 应用程序 并希望为区域名称创建下拉菜单 例如 us east 1 等 如果有人已经创建了 gem 来获取它们 我想使用它 有人知道这样的 gem 或有用的 API 吗 适用于 Ruby 的 AWS 开发工
  • 如何使用 Ruby 2.7.0 修复 Rails 的警告消息

    有没有人解决这个问题Ruby 2 7 0 I used rbenv并安装了 Ruby v2 7 0 然后使用创建了一个 Rails 项目Rails v6 0 2 1 目前 通过运行之一 rails s rails s u puma rail
  • 由于符号链接错误,无法在 Mac OSX 10.8.1 中安装 ruby​​-1.9.2

    首先 我尝试了常见的rvm安装 rvm安装1 9 2 但是 显示了以下错误 The provided compiler usr bin gcc is LLVM based it is not yet fully supported by r
  • 通过使用 Minitest 的 Rails,如何设置 RuboCop 在每次使用 rake 运行测试时自动运行?

    当我运行以下命令时 我想要RuboCop https github com bbatsov rubocop在测试运行之前检查我指定的应用程序目录 bundle exec rake test 我添加了以下任务lib tasks test ra
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • 使用 YAML.load 解析 json 安全吗?

    我使用的是红宝石2 1 0 我有一个 json 文件 例如 测试 json item apple 1 banana 2 使用 YAML load 加载此文件是否安全 YAML load File read test json 我正在尝试加载
  • 从类内部调用属性访问器方法[重复]

    这个问题在这里已经有答案了 我正在尝试调用我的类属性编写器之一 但由于某种原因它永远不会被调用 下面是一些代码 可以使这一点更清楚 class Test attr reader test def test val puts Called t
  • Rails 3 - “无法解析 Yaml”

    我不知道我做错了什么 我尝试运行 rails c 但它只是给了我一个错误 10 分钟前它还在工作 C Ruby192 lib ruby 1 9 1 psych rb 148 in parse couldn t parse YAML at l
  • Twitter Bootstrap 中下拉链接的模态

    我正在尝试从下拉菜单中的链接进行模式启动 该模式似乎已启动 网站变为灰色 但看不到 来自不在下拉列表中的常规链接的模态工作得很好 我对 jquery 进行了愚弄 但由于我是 jquery 的新手 所以没有任何结果 这是我的网站代码
  • HABTM 关系和accepts_nested_attributes_for

    我有一个可以让我创建的表单新博客文章我希望能够创造新类别来自同一个表格 我在帖子和类别之间有一个习惯关系 这就是我遇到麻烦的原因 我有以下2个型号 class Post lt ActiveRecord Base has and belong
  • 数据库分片和 Rails

    在 Rails 中处理分片数据库的最佳方法是什么 分片应该在应用层 活动记录层 数据库驱动层 代理层还是其他层处理 各自的优点和缺点是什么 FiveRuns 有一个名为的 gem数据结构 https github com bpot data
  • 带有附加参数的redirect_to

    我是一个菜鸟 redirect to users url notice Succeed p p 然后我添加一个message它失败了 redirect to users url notice Succeed message test p p
  • 使用复选框过滤列表

    我有一个电影列表及其评级 在我的页面顶部 我有一个表单 其中提供了一个复选框列表 其中显示了每个可用的评级 G PG 13 等 一旦用户单击复选框并点击提交 我只想显示所选的电影 在我的索引方法中 我有一个名为的实例变量 filtered
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • Rails 3.1 和图像资源

    我已将管理主题的所有图像放入名为 admin 的文件夹内的资产文件夹中 然后我像平常一样链接到它 Ruby image tag admin file jpg CSS logo background url assets images adm

随机推荐