2015-03-19 88 views
5

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

UPDATE:看起来问题很有意义。这是我想要的一个例子。某些型号不能被删除,所以我添加了一个回调总是会抛出异常:

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模块并将其混合到所需的所有类中? – 2015-03-19 09:37:45

+0

“模特助手”是什么意思?也许你正在寻找装饰者? – 2015-03-19 09:42:43

+0

如果您举了一个例子,我认为这会有所帮助,那么人们可以就约定提出建议:有很多方法可以做任何事情,但通常坚持常规是一个好主意。 – 2015-03-19 09:57:12

回答

7

如果你想使用是helper_methodmy_helper_method一个model里面,你可以写

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

我正在寻找相同的东西,我发现你的答案对我有帮助。谢谢:) – 2015-03-19 10:05:12

+0

@HetalKhunti:很高兴听到你发现它有帮助 – 2015-03-19 10:06:39

8

如果你问是在哪里把跨多个车型在轨4.2共享代码,然后将标准答案是使用顾虑:How to use concerns in Rails 4

然而,有一些很好的论点(例如this)只是使用标准的导轨模块包括,并且按照marek-lipka的建议进行扩展。

我强烈建议不要在模型中使用ApplicationController帮助器方法,因为您会随身携带很多不必要的行李。在我看来,这样做通常是一种难闻的气味,因为这意味着你没有分离MVC元素,并且在你的应用程序中存在太多的相互依赖性。

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