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 и не смешиваете его со всеми классами, которые вы хотите? –

+0

Что означает «помощник для модели»? Может быть, вы ищете декоратора? –

+0

Это поможет, если вы приведете пример, который я думаю, тогда люди могли бы посоветовать на конвенции: есть много способов сделать что-либо, но в целом придерживаться конвенции - хорошая идея. –

ответ

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.

через: сообщение makandracards.

Для справки: http://railscasts.com/episodes/132-helpers-outside-views

+1

Я искал то же самое, и я нашел ваш ответ полезным в моем случае. Спасибо :) –

+0

@HetalKhunti: Рад слышать, что вы сочли полезным –

8

Если то, что вы спрашиваете, куда поместить код, который является общим для нескольких моделей в рельсы 4.2, то стандартный ответ должен быть использовать проблемы: How to use concerns in Rails 4

Однако , есть несколько хороших аргументов (например, this) только для использования стандартного модуля рельсов, который распространяется и распространяется, как предлагает marek-lipka.

Я бы настоятельно рекомендовал НЕ использовать вспомогательные методы ApplicationController в модели, так как вы будете импортировать много ненужного багажа вместе с ним. На мой взгляд, это, как правило, плохой запах, поскольку это означает, что вы не разделяете элементы MVC, и в вашем приложении слишком много взаимозависимости.

Если вам нужно изменить объект модели, добавив метод, который используется только в представлении, посмотрите на декораторы. Например, https://github.com/drapergem/draper