2015-03-19 92 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