6

Uygulamam için bir raporlama sistemi yapıyorum. Örnek bir ReportKind yarattım, ancak birçok şeyi bildirebildiğim için farklı rapor türleri grubu oluşturmak istedim. Çok fazla davranış paylaştıklarından, miras kullanmayı deniyorum.Raylar Modellerdeki kalıtım modeli

model ReportKind << ActiveRecord::Base 
end 

ve örneğin oluşturuldu::

Yani ana modeli var ben türü sütun ettik benim masa report_kinds ise

model UserReportKind << ReportKind 
end 

ve burada dek onun tüm çalışma. Sorunum formlarda/denetleyicide. Ben ReportKind.new yaptığınızda

, benim form '* report_kind *' öneki ile inşa edilmiş. Bir hatta ile UserReportKind, olsun, 'user_report_kind' öneki inşa edecek formu.

Bu, kontrolörlerdeki herşeyi karıştırıyor, çünkü bazen param [[report_kind], bazen param [: user_report_kind], vb. Yaptığım her başka miras için param olacak.

uzağa için kullandıkları 'report_kind' öneki zorlamak için yine de var mı? Ayrıca, denetleyicideki "type" özniteliğini zorlamak zorunda kaldım, çünkü formdan doğrudan değeri almadı, bunu yapmanın güzel bir yolu var mı? Kalıtsal modeller adlarında göre rotaları oluşturmaya çalışıyordum beri

Yönlendirme, başka bir sorun oldu. Aynı modele işaret eden rotalarda diğer modelleri ekleyerek bunu aştım.

cevap

6

miras Bu tür her zaman zordur. Neyse ki bahsettiğiniz problemlerin hepsi çözülebilir.

İlk olarak, bu gibi özel nitelik adını ve URL'sini kullanmaya formları zorlayabilirsiniz: Bu params olmak @report_kind için tüm params zorlar

<%= form_for :report_kind, @report_kind, :url => report_kind_path(@report_kind) %> 

[: report_kind] bakmaksızın @report_kind bir olup olmadığının UserReportKind veya değil. Ayrıca, tüm posta ve istekleri de ReportKindsController'a gidecek.

<%= form.hidden_field :type, 'UserReportKind' %> 

Son olarak, rotalar için, aşağıdaki yapacağını:

İkincisi, böyle bir gizli özniteliği ile türünü belirtebilirsiniz

map.resources :user_report_kinds, :controller => :report_kinds 

Bu demek ki/gibi herhangi bir URL user_report_kinds/... aslında ReportKindsController kullanacaktır.

+0

<% = form.hidden_field: tipi: = değer> 'UserReportKind' %> benim için çalıştı. – cider