【问题标题】:Rails Gem with model-relationships for Rails EnginesRails Gem 与 Rails 引擎的模型关系
【发布时间】:2013-08-26 19:50:25
【问题描述】:

我只是在开发一个包含许多引擎的 Rails 应用程序。 但是,我无法在引擎中编辑关系。

为了解决这个问题,我想创建一个关系-Gem,它将包含在应用程序中并定义关系(请参阅:https://stackoverflow.com/a/11835899/603126)。

假设,我有一个用户(命名空间和隔离)引擎和一个评论(命名空间和隔离)引擎。 我想要的是覆盖/扩展关系中的关系-Gem 将共享关系。

所以我添加了一个文件 /app/models/comment.rb 与这些行(到关系-Gem):

class Comment < CommentEngine::Comment
  belongs_to :user
end

class User < UserEngine::User
  has_many :comments
end

如果我运行我的 rails 应用程序,则不会建立关系。

我错过了什么? 如何实现?

非常感谢您

【问题讨论】:

  • 你能把你的控制器代码贴在建立关联的地方吗(新建和创建操作)?
  • 在 cmets_controller 内部:def index @cmets = current_user.cmets end undefined method `cmets' for #<:user:0x007fc4a64ffb10> 似乎模型从未加载。即使我在文件中输入了错字,也没有任何反应。非常感谢!
  • 在创建新评论的阶段,在 CommentsController 中,您的 newcreate 操作如何?
  • 它们还没有实现。我只有一个看起来像上面描述的索引操作。
  • 我想你正在处理现有的数据库记录?你可以看看这个Rails guide,找点4.1

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 gem


【解决方案1】:

好的, 所以我找到了解决方案。

您可以使用装饰器对引擎进行猴子补丁(您需要将其放入 config/initializers/initializer_name.rb)

见:Extending a ruby gem in Rails

不知道这是不是一件好事,但它就像一个魅力......

缺点是每次更改猴子补丁时都必须重新启动服务器...

编辑:似乎这个猴子补丁会在几次请求后被垃圾收集。

编辑 2: 这篇文章帮助了我 How to monkey-patch code that gets auto-loaded in Rails? 您需要在 Intializer 中添加薄罪,以强制 rails 为每个请求重新加载您的补丁

Rails.configuration.to_prepare do

【讨论】:

    【解决方案2】:

    activesupport-decorators gem 可以在加载原始类时为您加载装饰器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多