Я ищу лучший способ извлечь класс из списка аргументов, который стал слишком длинным в одном из моих сервисов. Я попытался следовать нескольким статьям и сообщениям здесь, но не повезло. Мой код:
app / services / location / update_event.rb
class Location::UpdateEvent
def self.call(location:, event_id:, created_by:, city_details: nil, city_description: nil, city_weather: nil, city_location: nil )
# Would like to to extract the above city arguments into its own class called city_info
ActiveRecord::Base.transaction do
LocationEvent.create(
event: Event.find(event_id),
location: location,
# Here is where this data is then being sent to another servixe
city_details: city_details,
city_description: city_description,
city_weather: city_weather,
city_location: city_location,
entered_at: Time.zone.now
)
end
end
end
Вот что я попробовал, и заменил 4 аргумента на city_info:
в update_location .rb.
app / services / event / city_info.rb
class CityInfo
attr_accessor :city_details, :city_description, :city_weather, :city_location
def initialize(
city_details: nil,
city_description: nil,
city_weather: nil,
city_location: nil)
@city_details = city_details
@city_description = city_description
@city_weather = city_weather
@city_location = city_location
end
end
И, наконец, вот метод обновления от контроллера, который изначально принимает параметры, и отправляет их в сервис. Они должны быть в состоянии быть ноль в случае.
def update
authorize(location)
@location = Location::UpdateEvent.call(
location: location,
event_id: params[:event_id],
created_by: current_user,
city_details: params[:city_details],
city_description: params[:city_description],
city_weather: params[:city_weather],
city_location: params[:city_location]
)
@location.reload
@location = LocationDecorator.new(@location)
end