【问题标题】:Helper methods for models in RailsRails 中模型的辅助方法
【发布时间】:2023-03-03 03:25:01
【问题描述】:

Rails 中模型的辅助方法有合适的位置吗?有控制器和视图的辅助方法,但我不确定放置模型辅助方法的最佳位置。除了向ActiveRecord::Base 添加一个方法之外,我不希望这样做。

更新:看起来关注很有意义。这是我想要的一个例子。某些模型永远无法删除,所以我添加一个总是抛出异常的回调:

before_destroy :nope
def nope
  raise 'Deleting not allowed'
end

有顾虑,我可以做这样的事情吗?

class MyModel < ActiveRecord::Base
  include Undeletable
end

module Undeletable
    extend ActiveSupport::Concern

    included do 
      before_destroy :nope 
    end

    def nope
      raise 'Deleting not allowed'
    end
end

这是 Rails 的做法吗?

【问题讨论】:

  • 你为什么不使用普通的旧 Ruby 模块并将它混合到你想要的所有类中?
  • “模型助手”是什么意思?也许您正在寻找装饰师?
  • 如果你举一个我认为的例子会有所帮助,然后人们可以就惯例提出建议:有很多方法可以做任何事情,但通常坚持惯例是个好主意。
  • 能否给ActiveRecord::Base添加一个例子(代码)你想添加什么样的方法。
  • 一个普通的旧 Ruby 模块是有道理的,这就是我要做的,只是想有一种更多的 Rails 方法可以做到这一点。我认为这与关注有关。我添加了一个示例。

标签: ruby-on-rails ruby ruby-on-rails-4 model ruby-on-rails-4.2


【解决方案1】:

如果你想在model 中使用helper_method my_helper_method,你可以写

ApplicationController.helpers.my_helper_method

如果你需要更多的灵活性,例如如果你还需要重写一些方法,你可以这样做:

class HelperProxy < ActionView::Base
  include ApplicationController.master_helper_module

  def current_user
    #let helpers act like we're a guest
    nil
  end       

  def self.instance
    @instance ||= new
  end
end

然后与

一起使用
HelperProxy.instance.my_helper_method

如果你胆子大,也可以尝试将ApplicationController.master_helper_module直接包含在model中。

通过:makandracards 的帖子。

供您参考:http://railscasts.com/episodes/132-helpers-outside-views

【讨论】:

  • 我一直在寻找相同的内容,我发现您的回答对我的情况很有帮助。谢谢:)
  • @HetalKhunti :很高兴听到你发现它有帮助
  • 我认为在谨慎使用时,ApplicationController.helpers.my_helper_method 在模型之间共享代码非常有用,而无需创建和包含专门的模块。
【解决方案2】:

如果您要问的是在 rails 4.2 中将跨多个模型共享的代码放在哪里,那么标准答案必须是使用关注点:How to use concerns in Rails 4

但是,有一些很好的论据(例如 this)仅使用标准 rails 模块包含,并按照 marek-lipka 的建议进行扩展。

我强烈建议不要在模型中使用 ApplicationController 辅助方法,因为您会同时导入很多不必要的包袱。在我看来,这样做通常很糟糕,因为这意味着你没有分离 MVC 元素,并且你的应用程序中存在太多的相互依赖关系。

如果您需要通过添加仅在视图中使用的方法来修改模型对象,请查看装饰器。例如https://github.com/drapergem/draper

【讨论】:

    猜你喜欢
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2016-07-22
    • 1970-01-01
    • 2023-01-20
    相关资源
    最近更新 更多