Общий метод в модели и помощнике
У меня есть общий метод, который существует в моей модели, потому что он вызывается моей моделью. Ретроспективно, мой взгляд также требует этого модельного метода. Для этого я:
- переместил метод модели в файл
application_helper.rb
- моя модель вызывает метод application_helper, добавив
include ApplicationHelper
в начало моей модели ActiveRecord
Функциональность мудрая, она работает. Но это хорошая практика?
Моя модель выглядит так:
class Client < ActiveRecord::Base
include ApplicationHelper
end
Ответы
Ответ 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