Bir metodu birden fazla modelin içinde kullanma ihtiyacı duyduğumuzda(örn: SomeTokenGenerator
adı altında bir iki metod) bunu models
klasörü altında bulunan concerns
klasörü içerisine module
olarak tanımlayıp, herhangi bi model içinde include
edip kullanmak concern
'leri amacı dışında kullanmak mı olur acaba? Bunun best practices’leri nedir tam olarak? Şimdiden teşekkürler.
Evet. Amacı dışında bir kullanım olur. Bahsettiğiniz durum Ruby’de normal bir module tanimi. Concern ise module’e ek özellikler getiren, en temelde sınıf metodlarının da sınıflara eklenebilmesini sağlayan bir yapı. Şahsen ActiveSupport::Concern
'u extend etmeyen herhangi bir module’un concerns
klasöründe olmasına karşıyım.
Biraz klasik olacak ama, en azından bence, senin amacına göre değişir
SomeTokenGenerator
gibi durumlarda benim ilk tercihim Rails yerine sade Ruby objeleri (İngilizce için PORO diye aratabilirsin) kullanmak. Mesela, SomeTokenGenerator
diye bir servis objesi yaratabilirsin ve ihtiyacına göre çağırabilirsin:
class SomeTokenGenerator
def initialize(user_id)
@user = User.find(user_id)
end
def call
if generated?
OpenStruct.new(success?: false, payload: { reason: "User cannot access." })
else
OpenStruct.new(success?: true, payload: { user: @user, token: @token })
end
end
private
def generated?
# ...
end
Ayrıca, konu biraz da seviyeyle alakalı. Eğer yeni başlıyorsan best practice’lere çokta takılmadan, ilk önce çalışan bir kodu hedefle derim.