Подтвердить что ты не робот

Общий метод в модели и помощнике

У меня есть общий метод, который существует в моей модели, потому что он вызывается моей моделью. Ретроспективно, мой взгляд также требует этого модельного метода. Для этого я:

  • переместил метод модели в файл application_helper.rb
  • моя модель вызывает метод application_helper, добавив include ApplicationHelper в начало моей модели ActiveRecord

Функциональность мудрая, она работает. Но это хорошая практика?

Моя модель выглядит так:

class Client < ActiveRecord::Base
  include ApplicationHelper
end
4b9b3361

Ответ 1

Написание include ApplicationHelper для вашей модели - это плохая практика, потому что ApplicationHelper - прекрасное место, чтобы наложить тонны вспомогательных функций, которые вам нужны в ваших представлениях. Эти функции в конечном итоге будут импортированы как примеры методов вашей модели. Эти функции в основном не связаны с вашей моделью и не будут работать, если они зависят от таких вещей, как params или request. Вот еще два варианта:

Вариант 1:

Вы можете просто определить метод внутри класса Client, а затем вызвать его из представления, например:

class Client < ActiveRecord::Base
    def self.my_class_method
    end
    def my_instance_method
    end
end

И затем, на ваш взгляд:

<%= Client.my_class_method %>
<%= @client.my_instance_method %>

Вариант 2:

Сделайте отдельный модуль в lib и включите его в нужные вам места. Имя файла должно совпадать с именем модуля для автоматической загрузки.

В lib/my_module.rb:

module MyModule
    def my_method
    end
end

В вашей модели:

class Client < ActiveRecord::Base
    include MyModule
    def other_method
      my_method
    end
end

Включите модуль в ApplicationHelper, чтобы он был доступен для всех ваших просмотров:

module ApplicationHelper
    include MyModule
end

Тогда, на ваш взгляд, вы можете легко его назвать:

<%= my_method %>

Ответ 2

Если вы хотите переместить его в помощник, вы должны перенести его в client_helper, поскольку это что-то только для вашей модели клиента, а не для всего приложения.

Метод, о котором вы говорите, это статический метод класса или метод экземпляра? Если это метод экземпляра, ваши модели (даже если они находятся в представлениях) могут вызвать этот метод. Если это статический метод класса, то ваши представления также могут использовать его, вызывая его как любой другой метод статического класса (т.е. Client.do_method или что-то еще).

Я не вижу причин, почему это должно быть в помощнике, если ваш метод не имеет абсолютно ничего общего с вашей моделью, и в этом случае это будет другой вопрос.

Ответ 3

5 Общий метод в модели и помощнике:

Вариант 1:

                    You can just define the method inside the Client class, and then call it from the view, 
                    like this:

                    class Client < ActiveRecord::Base
                        def self.my_class_method
                        end
                        def my_instance_method
                        end
                    end

                    And then in your view:

                        <%= Client.my_class_method %>
                        <%= @client.my_instance_method %>

Вариант 2:

                    module MyModule
                        def my_method
                        end
                    end

                  Include the module in ApplicationHelper so it is available to all your views:

                    module ApplicationHelper
                        include MyModule
                    end

                    Then in your view you can call it easily:

                    <%= my_method %>

вариант 3:

                    module MyModule
                        def my_method(amount)
                        end
                    end

                    In your model:

                    class Client < ActiveRecord::Base
                        include MyModule
                        def self.other_method(amount)
                          my_method(amount)
                        end
                    end     

                    Then in your view you can call it easily:

                    <%= Client.other_method(amount) %>  

Вариант 4:                      Или вы можете объявить вспомогательный метод как функцию класса и использовать его так:

                    module Myhelper
                        def self.my_village
                          "bikharniyan kallan,Rajasthan,India"
                        end
                    end 

                  Then in your view you can call it easily:

                    <%= Myhelper.my_village %>  

вариант 5:                    использовать много помощников в контроллере                       помощник = >

                        module Myhelper
                            def my_info
                              "my information is"
                            end
                        end

                        module Myhelper1
                            def my_village
                              "bikharniyan kallan,Rajasthan,India"
                            end
                        end

                    ApplicationHelper=> 

                        module ApplicationHelper
                            include Myhelper
                            include Myhelper1
                        end

                    ApplicationController

                        class ApplicationController < ActionController::Base
                            include ApplicationHelper
                        end 

                    YourController  

                        class YourController < ActionController::Base
                            def action
                              my_info
                              my_village
                            end
                        end

Ответ 4

В этот момент с помощью рельсов 5 вы можете просто надавить свой общий метод на application_record.rb

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  def self.common_class_method
    # some awesome implement
  end

  def common_method
    # implement this
  end
end

Затем в каждом классе модели вы можете вызвать common_class_method: YourClassName.common_class_method

или вызовите common_method: YourClassInstance.common_method