SORU
22 Aralık 2010, ÇARŞAMBA


ŞTİ alt sınıflar için yolları işlemek için en iyi uygulamalar raylar

Raylar görüş ve benim denetleyicileri redirect_to, link_to, form_for yöntem çağrıları ile doludur. Bazen link_to redirect_to ilişkilendiriyorlar yolları (*örneğin 6*) açık değildir, ancak birçok kez yolları örtülü (örneğin link_to 'Show', person).

Ben eklemek bazı tek tablo devralma (STI) model (Employee < Person) ve tüm bu yöntemleri kırmak için bir örnek alt sınıfı (Employee); ne zaman raylar yürütür link_to @person hata undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>. Raylar bir güzergah sınıf adı ile tanımlanan çalışanı olan bir nesne arıyor. Bu çalışan rotaları tanımlanır ve eylemleri de belli değil yani çalışan denetleyicisi diye bir şey yok.

Bu soru daha önce de soruldu:

  1. StackOverflow, cevap tüm kod temeli link_to vb her örneğini düzenlemek ve yolunu açıkça devlete
  2. StackOverflow tekrar, iki kişi routes.rb üst sınıf (map.resources :employees, :controller => 'people') alt kaynak göster için kullanmanızı öneririz. Bu YÜZDEN aynı soruyu en iyi cevap-döküm tipi her örneği bulunanla .becomes kullanarak nesne gösteriyor
  3. StackOverflow üst cevabım var ama bir tane de Kendine kampı Tekrar Yapmak, ve yinelenen her alt sınıf için iskele oluşturmayı öneriyor.
  4. Here's üst cevap yanlış (büyü işe Yarıyor Raylar!) gibi görünüyor, aynı soruyu bir daha bu KADAR,
  5. Web üzerinde başka bir yerde, F2Andy yolunu kodu her yerde düzenleme önerir this blog post buldum.
  6. Mantıksal Gerçeklik Tasarımı 34* *blog yazısı üzerine, üst sınıf denetleyici Bir alt sınıf için kaynakları, gibi ÇOK sayıda 2 yukarıdaki harita cevap vermek tavsiye edilir.
  7. Alex Reisner bir yazı Single Table Inheritance in Rails " savunuyor karşı eşleme kaynakları alt sınıflar üst sınıf routes.rb beri tek yakalar yönlendirme kırılmaları link_to redirect_to ama form_for. Üst sınıf yöntemi alt sınıf hakkında yalan söylemen için ekleme önerir yerine. Kulağa hoş geliyor, ama yöntem bana hata undefined local variable or method `child' for # verdi.

En şık görünüyor ve en fazla fikir birliği olan cevap (ama hepsi değilbuzarif, ne debuçok görüş birliği) routes.rb senin için kaynakları Ekle. Bu form_for parlamıyor. Biraz netlik ihtiyacım var! Yukarıdaki seçenekler birinin ortaya çıkması, benim seçenekleri vardır

  1. göster routes.rb üst sınıf denetleyici Bir alt sınıf kaynakları (ve tüm alt sınıflar üzerinde form_for aramama gerek yok umarım)
  2. Geçersiz iç yöntemleri sınıfları birbirimize yalan yapmak için raylar
  3. Bir nesnenin eylem yolunu açık veya örtülü olarak, ya yolunu değiştiriyor ya da tür çevrim nesne çağrılır kodu her seferinde düzenlemek.

Tüm bu çelişkili cevapları olan, bir iktidar istiyorum. İyi cevap yok gibi geliyor bana. Bu raylar' tasarımı mı? başarısız. Eğer öyleyse, tamir olabilecek bir hata mı? Ya değilse, o zaman umarım yakında birileri olabilir bırakma beni düz bu, bana yardımcı artılarını ve eksilerini her seçenek (ya da açıkla neden böyle bir seçenek yok), ve hangisi doğru cevap, ve neden. Ya da web de bulamıyorum doğru bir cevap var mı?

CEVAP
27 ŞUBAT 2012, PAZARTESİ


Bu kadar az yan etki ile kalmayı başardım en basit çözüm.

class Person < Contact
  def self.model_name
    Contact.model_name
  end
end

Şimdi url_for @person beklendiği gibi contact_path göster.

Nasıl çalışır:URL yardımcıları YourModel.model_name model üzerine yansıtmak ve birçok şeyler arasında) tekil/çoğul rota anahtarları üretmek için kullanır. Burada Person temelde söylüyorSadece Contact adam gibi, onu sormak istiyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • John Lynn

    John Lynn

    8 Ocak 2010
  • laptopmag

    laptopmag

    25 Ocak 2008
  • Nightmare2005

    Nightmare200

    14 Ocak 2007