У меня есть несколько методов контроллера, которыми я хотел бы поделиться. Как лучше всего это сделать в Ruby on Rails? Должен ли я создать абстрактный класс, который расширяют мои контроллеры, или мне следует создать модуль и добавить его к каждому контроллеру? Ниже приведены методы контроллера, которыми я хочу поделиться:
def driving_directions
@address_to = params[:address_to]
@address_from = params[:address_from]
@map_center = params[:map_center_start]
# if we were not given a center point to start our map on
# let's create one.
if !@map_center && @address_to
@map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_to).ll
elsif !@map_center && @address_from
@map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_from).ll
end
end
def printer_friendly
starting_point = params[:starting_point].split(',').collect{|e|e.to_f}
ne = params[:ne].split(',').collect{|e|e.to_f}
sw = params[:sw].split(',').collect{|e|e.to_f}
size = params[:size].split(',').collect{|e|e.to_f}
address = params[:address]
@markers = retrieve_points(ne,sw,size,false)
@map = initialize_map([[sw[0],sw[1]],[ne[0],ne[1]]],[starting_point[0],starting_point[1]],false,@markers,true)
@address_string = address
end
ruby-on-rails
ruby
Кайл Бун
источник
источник
Ответы:
На мой взгляд, применимы обычные принципы объектно-ориентированного проектирования:
Maps
и получите доступ к таким методам, как:Maps::driving_directions
.class MapController < ApplicationController
) и поместите туда общий код.В вашем случае методам требуется state (
params
), поэтому выбор зависит от логической взаимосвязи между контроллерами, которым это нужно. К тому же:Также:
источник
Я знаю, что этот вопрос задавали 6 лет назад. Просто хочу отметить, что в Rails 4 теперь есть проблемы с контроллерами, которые являются более нестандартным решением.
источник
На самом деле я думаю, что модуль - лучший способ поделиться кодом между контроллерами. Помощники хороши, если вы хотите поделиться кодом между представлениями. Помощники - это в основном прославленные модули, поэтому, если вам не нужен доступ на уровне просмотра, я предлагаю разместить модуль в папке lib.
После создания модуля вам нужно будет использовать оператор include, чтобы включить его в нужные контроллеры.
http://www.rubyist.net/~slagell/ruby/modules.html
источник
Я согласен с модульным подходом. Создайте отдельный файл Ruby в каталоге lib и поместите модуль в новый файл.
Наиболее очевидным способом было бы добавить методы в ваш ApplicationController, но я уверен, что вы это уже знаете.
источник
если вы хотите обмениваться кодами между контроллером и помощниками, вам следует попробовать создать модуль в библиотеке. Вы также можете использовать @template и @controller для доступа к методу в контроллере и помощнике. Проверьте это для получения дополнительной информации http://www.shanison.com/?p=305
источник
Другая возможность:
Если вашему общему коду требуется состояние, и вы хотите поделиться поведением между контроллерами, вы можете поместить его в простой старый класс ruby в вашем каталоге
model
илиlib
. Помните, чтоmodel
классы не обязательно должны быть постоянными, даже если все классы ActiveRecord являются постоянными. Другими словами, допустимы переходныеmodel
классы.источник
Я обнаружил, что один из эффективных способов совместного использования идентичного кода между контроллерами - это наследование одного контроллера от другого (где находится код). Я использовал этот подход для совместного использования идентичных методов, определенных в моих контроллерах, с другим набором контроллеров с пространством имен.
источник