Я пытаюсь сделать запись для моего приложения rails и у меня есть некоторые дилеммы по поводу философии, используемой в rails. Мое приложение имеет Link
модель, которая has_many
Hit
s:
class Link < AR::Base
has_many :hits
end
class Hit < AR::Base
belongs_to :link
end
Теперь при каждом обращении к ссылке я вызываю метод hit!
, чтобы записать запрос по ссылке (чтобы сохранить контроллер в скине, я делаю модель жирной):
class LinksController < ApplicationController
def hit
link = Link.find(params[:id])
link.hit!(request)
end
end
class Link < AR::Base
def hit!(request)
params = extract_data_from_request(request)
hits.create(params)
end
end
Теперь вот где я запутался. Я хочу записать данные, которые пришли с объектом request
(например, удаленный ip, реферер, пользовательский агент и т. Д.), Поэтому мне нужно передать объект запроса в модель, но я считаю, что это не соответствует разделению интересов "и стирает границы ответственности в схеме проектирования MVC (конечно, поправьте меня, если я ошибаюсь). Также, если я создам Hit
объект в самом контроллере, то я делаю тощую модель и толстый контроллер:
class LinksController < ApplicationController
def hit
hit_params = extract_data_from_request(request)
Hit.create(hit_params.merge(:link_id => params[:id])
end
end
Хотя в последнем случае тестирование значительно упрощается (мне не нужно имитировать запрос в спецификациях моделей) - оно просто кажется неправильным.
Любой совет по этому поводу - высоко ценится.
P.S. extract_data_from_request(req)
метод размещается в соответствующих местах, где это необходимо. Возвращает хэш необходимых атрибутов для Hit
объекта.