SORU
9 Mart 2011, ÇARŞAMBA


STI, bir denetleyici

Raylar yeniyim ve bu tasarım problemi ile kaldım, bunu çözmek için kolay olabilir, ama hiçbir yerde yoktu. Reklamlar iki farklı türü var: olayları ve pazarlık. Her ikisi de aynı özelliklere onlara: Başlık, Açıklama ve bir resim (ataç). Ayrıca uygulamak için eylemler aynı tür var: dizin, düzenleme, oluşturma, güncelleme ve yeni yok.

Böyle bir STI kurdum:

Reklam Modeli: reklam.rb

class Ad < ActiveRecord::Base
end

Pazarlık Modeli: pazarlık.rb

class Bargain < Ad
end

Vurgulamak Model: vurgulayın.rb

class Highlight < Ad
end

Sorun olduğunu görmek isterdim sadece bir denetleyici (AdsController) yürüttüğü eylemleri dedim üzerinde pazarlık veya olayları bağlı URL, söyle www.foo.com/bargains[/...] www.foo.com/highlights[/...].

Örneğin:

  • Www.foo.com/highlights =>olayları tüm reklamların bir listesi.
  • Www.foo.com/highlights/new =>yeni bir vurgulamak oluşturmak için form vb...

Bunu nasıl yapabilirim?

Teşekkürler!

CEVAP
10 Mart 2011, PERŞEMBE


fl00r iyi bir çözüm vardır, ancak bir düzeltme yapmak istiyorum.

Bu durumda gerekli olmayabilir. STI modelleri değişen ne olduğuna bağlı, özellikle doğrulamalarını & yaşam döngüsü kanca.

Kumandanız için özel bir yöntem kullanmak istediğiniz sabit: gerçek sınıf yazın param dönüştürmek için ekleyin

def ad_type
  params[:type].constantize
end

Yukarıdaki güvensiz, ancak. Tip: bir beyaz listeye ekleyin

def ad_types
  [MyType, MyType2]
end

def ad_type
  params[:type].constantize if params[:type].in? ad_types
end

Raylar constantize yöntemi daha: http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize

Denetleyici eylemleri yapabilirsin:

def new
  ad_type.new
end

def create
  ad_type.new(params)
  # ...
end

def index
  ad_type.all
end

Ve şimdi öznitelik türü kümesi ile üst sınıf yerine, doğru davranış ile gerçek sınıf kullanıyorsunuz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iBand IguJoo

    iBand IguJoo

    25 AĞUSTOS 2006
  • kidrauhl

    kidrauhl

    15 Ocak 2007
  • Tomas N

    Tomas N

    14 Kasım 2010