Rails アプリのロギングを作成しようとしていますが、Rails で使用される哲学についてジレンマがあります。私のアプリには次のLink
モデルがありhas_many
Hit
ます:
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
ここで私は混乱しています。オブジェクトに付属するデータ(リモートIP、リファラー、ユーザーエージェントなど)を記録したいrequest
ので、リクエストオブジェクトをモデルに渡す必要がありますが、これは「関心の分離」に準拠しておらず、ぼやけていると思います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
後者の場合はテストがはるかに簡単になりますが (モデル仕様でリクエストをモックする必要はありません)、正しくないように思えます。
これに関するアドバイス - 大変感謝しています。
PSextract_data_from_request(req)
メソッドは、必要に応じて適切な場所に配置されます。オブジェクトに必要な属性のハッシュを返しHit
ます。