Ruby on Rails'te denetleyiciler arasında kodu yeniden kullanmak için En İyi Uygulamalar


82

Paylaşmak istediğim bazı denetleyici yöntemlerim var. Ruby on rails'de bunu yapmak için en iyi uygulama nedir? Denetleyicilerimin genişlettiği soyut bir sınıf mı oluşturmalıyım yoksa modül oluşturup her denetleyiciye eklemeli miyim? Aşağıda paylaşmak istediğim denetleyici yöntemleri bulunmaktadır:

def driving_directions
  @address_to = params[:address_to]
  @address_from = params[:address_from]
  @map_center = params[:map_center_start]

  # if we were not given a center point to start our map on
  # let's create one.
  if !@map_center && @address_to
    @map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_to).ll
  elsif !@map_center && @address_from
    @map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_from).ll
  end
end

def printer_friendly
  starting_point = params[:starting_point].split(',').collect{|e|e.to_f}
  ne = params[:ne].split(',').collect{|e|e.to_f}
  sw = params[:sw].split(',').collect{|e|e.to_f}
  size = params[:size].split(',').collect{|e|e.to_f}
  address = params[:address]

  @markers = retrieve_points(ne,sw,size,false)
  @map = initialize_map([[sw[0],sw[1]],[ne[0],ne[1]]],[starting_point[0],starting_point[1]],false,@markers,true)
  @address_string = address
end

1
Bu durumda application.rb'yi kullanmamanın belirli bir nedeni var mı?
PJ.

4
Yalnızca bazı denetleyicilerin kodu kullanacağı, ancak hepsini kullanmayacağı.
Kyle Boon

Yanıtlar:


113

Bana göre normal OO tasarım ilkeleri geçerlidir:

  • Kod gerçekten nesne durumuna erişime ihtiyaç duymayan bir dizi yardımcı programsa, onu ayrı olarak çağrılacak bir modüle koymayı düşünürdüm. Kod tüm haritalama programları ise Örneğin, bir modül oluşturmak Mapsve benzeri yöntemlerine erişmek: Maps::driving_directions.
  • Kod duruma ihtiyaç duyuyorsa ve her denetleyicide kullanılıyorsa veya kullanılabiliyorsa, kodu ApplicationController'a yerleştirin.
  • Kod duruma ihtiyaç duyuyorsa ve yakından ve mantıksal olarak ilişkili tüm denetleyicilerin bir alt kümesinde kullanılıyorsa (yani, hepsi haritalarla ilgili), bir temel sınıf ( class MapController < ApplicationController) oluşturun ve paylaşılan kodu oraya koyun.
  • Kod durum gerektiriyorsa ve çok yakından ilişkili olmayan tüm denetleyicilerin bir alt kümesinde kullanılıyorsa, onu bir modüle koyun ve gerekli denetleyicilere ekleyin.

Sizin durumunuzda, yöntemlerin state ( params) 'e ihtiyacı vardır , bu nedenle seçim, ona ihtiyaç duyan denetleyiciler arasındaki mantıksal ilişkiye bağlıdır. Ek olarak:

Ayrıca:

  • Mümkün olduğunda tekrarlanan kod için kısmi kullanın ve ortak bir 'bölümler' dizinine yerleştirin veya belirli bir yol aracılığıyla ekleyin.
  • Mümkün olduğunda (yöntemler için) RESTful yaklaşıma bağlı kalın ve kendinizi çok sayıda RESTful olmayan yöntem oluştururken bulursanız, bunları kendi denetleyicilerine çıkarmayı düşünün.

33

Bu sorunun 6 yıl önce sorulduğunu biliyorum. Sadece şunu belirtmek isterim ki, Rails 4'te artık kullanıma hazır bir çözüm olan Denetleyici Endişeleri var.


16

Aslında, bir modülün denetleyiciler arasında kod paylaşmanın en iyi yolu olduğunu düşünüyorum. Görünümler arasında kod paylaşmak istiyorsanız yardımcılar iyidir. Yardımcılar temelde yüceltilmiş modüllerdir, bu nedenle görünüm düzeyinde erişime ihtiyacınız yoksa, lib klasörünüze bir modül yerleştirmenizi öneririm.

Modülü oluşturduktan sonra, bunu istenen denetleyicilere eklemek için include ifadesini kullanmanız gerekir.

http://www.rubyist.net/~slagell/ruby/modules.html


1

Modül yaklaşımına katılıyorum. Kitaplık dizininizde ayrı bir Ruby dosyası oluşturun ve modülü yeni dosyaya koyun.

En açık yol, yöntemleri ApplicationController'ınıza eklemektir, ancak bunu zaten bildiğinizden eminim.


1

Eğer kontrolör ve yardımcılar arasında kod paylaşmak istiyorsanız, kütüphanede bir modül oluşturmayı denemelisiniz. Denetleyici ve yardımcıdaki yönteme erişmek için @template ve @controller kullanabilirsiniz. Daha fazla ayrıntı için bunu kontrol edin http://www.shanison.com/?p=305


0

Bir başka olasılık:

Ortak kodunuzun duruma ihtiyacı varsa ve davranışı denetleyiciler arasında paylaşmak istiyorsanız, onu ya modelda libdizininizdeki düz, eski bir ruby ​​sınıfına koyabilirsiniz . modelTüm ActiveRecord sınıfları kalıcı olsa bile sınıfların kalıcı olması gerekmediğini unutmayın . Başka bir deyişle, geçici modelsınıflara sahip olmak kabul edilebilir .


0

Aynı kodu denetleyiciler arasında paylaşmanın etkili bir yolunun, bir denetleyicinin diğerinden (kodun yaşadığı yerde) miras alması olduğunu buldum. Bu yaklaşımı, denetleyicilerimde tanımlanan özdeş yöntemleri başka bir ad alanlı denetleyici kümesiyle paylaşmak için kullandım.


1
Kodu paylaşmak için kalıtımın kullanılması bir kod kokusu olarak kabul edilir. Bundan kaçınmalısınız. Programmers.stackexchange.com/a/12446 adresine bakın . Bunun yerine modülleri, endişeleri ve hatta hizmetler nesnesini kullanın .
Mio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.