Rails模型的辅助方法

15

在Rails中,是否有适当的位置来放置模型的帮助方法?控制器和视图都有帮助方法,但我不确定放置模型帮助方法的最佳位置。除了将一个方法添加到ActiveRecord :: Base中之外,我不想这么做。

更新:看起来Concerns非常合理。以下是我想要的示例。某些模型永远无法被删除,因此我添加了一个回调函数,它始终会抛出异常:

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 的做法吗?


3
为什么不使用普通的 Ruby 模块并将其混合到您想要的所有类中? - Marek Lipka
“helper for model” 是什么意思?也许你要找的是装饰器(decorator)? - Rustam Gasanov
如果您能给出一个例子,那么人们可以就惯例提供建议:有很多方法可以做任何事情,但通常遵循惯例是一个好主意。 - Max Williams
1
你可以请提供一个例子(代码),说明你想要添加哪些方法到ActiveRecord::Base - spickermann
一个普通的 Ruby 模块是有意义的,这也是我要做的事情,只是觉得可能有更符合 Rails 的方式来实现。我认为使用 Concerns 是可以的。我已经添加了一个示例。 - at.
2个回答

19
如果您想在model中使用my_helper_method助手方法,您可以编写:

如果您想在model中使用my_helper_method助手方法,您可以编写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中。
via:makandracards的帖子。
供参考:http://railscasts.com/episodes/132-helpers-outside-views

1
我也在寻找同样的问题,发现你的答案对我的情况很有帮助。谢谢 :) - Hetal Khunti
@HetalKhunti:很高兴听到你觉得它有帮助。 - Gagan Gami
1
我认为当适度使用时,ApplicationController.helpers.my_helper_method 可以非常有帮助地在模型之间共享代码,而无需专门创建和包含一个模块。 - Joshua Pinter
你能提供makandracards的链接吗? - undefined

15
如果你正在询问在Rails 4.2中向多个模型共享代码的位置,那么标准答案就是使用Concerns: 如何在Rails 4中使用Concerns。但是,有一些好的论点(例如这篇文章)建议只使用标准的Rails模块包括和扩展,就像marek-lipka所建议的那样。
我强烈建议不要在模型中使用ApplicationController辅助方法,因为这会带来很多不必要的负担。这通常是我的坏味道,因为这意味着您没有分离MVC元素,并且您的应用程序中存在太多相互依赖。
如果您需要通过添加仅在视图中使用的方法来修改模型对象,则可以查看装饰器。例如:https://github.com/drapergem/draper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接