Rails'deki problemləri necə istifadə edə bilərik 4

Default olaraq Rails 4 layihə generatoru nəzarətçiləri və modelləri altında "problemlər" qovluğu yaradır. Marşrutlaşdırma problemlərini necə istifadə etmə ilə bağlı bir neçə izahat tapdım, lakin nəzarətçiləri və ya modelləri haqqında heç nə demədi.

Əminəm ki, bu cəmiyyətdə mövcud DCI meylləri ilə bağlıdır və cəhd etmək istərdim.

Sual, bu funksiyadan necə istifadə etməliyəm, işləməyiniz üçün adlandırma / sinif iyerarxiyasını necə müəyyənləşdirmək üçün bir razılaşma var? Bir problemi bir model və ya nəzarətçi içərisinə necə daxil etmək olar?

596
27 янв. yagooar tərəfindən təyin 27 yanvar 2013-01-27 00:36 '13 'da 0:36 2013-01-27 00:36
@ 6 cavablar

Beləliklə, mən özümü tapdım. Bu əslində çox sadə, lakin güclü bir anlayışdır. Aşağıdakı nümunədə olduğu kimi kodun təkrar istifadə olunması ilə bağlıdır. Prinsipcə, ideyalar modellərin təmizlənməsi və onların çox qalın və çirkli olmasını qarşısını almaq üçün ümumi və / və ya kontekstə uyğun kod parçaları çıxarmaqdır.

Bir nümunə olaraq, mən bir tanınmış model qoymaq, taggable model:

 # app/models/product.rb class Product include Taggable ... end # app/models/concerns/taggable.rb # notice that the file name has to match the module name # (applying Rails conventions for autoloading) module Taggable extend ActiveSupport::Concern included do has_many :taggings, as: :taggable has_many :tags, through: :taggings class_attribute :tag_limit end def tags_string tags.map( ') end def tags_string=(tag_string) tag_names = tag_string.to_s.split(', ') tag_names.each do |tag_name| tags.build(name: tag_name) end end # methods defined here are going to extend the class, not the instance of it module ClassMethods def tag_limit(value) self.tag_limit_value = value end end end 

Beləliklə, məhsulun görünüşünü izləməklə, Taggable-i istədiyiniz hər hansı bir sinifə əlavə edə və xüsusiyyətlərinizi paylaşa bilərsiniz.

Bu, DHH tərəfindən çox yaxşı izah olunur:

Rails 4-də, programcıları default proqramları / modelləri / problemləri ilə problemləri istifadə etmək və avtomatik olaraq açılış yoluna daxil olan ərizə / nəzarətçi / problem dizinləri ilə istifadə etməyə dəvət edirdilər. ActiveSupport :: Container-wrapper ilə birgə bu yüngül faktoring mexanizmini yaratmaq üçün kifayət qədər dəstək.

593
26 февр. Yagooar tərəfindən 26 Fevralda cavab verildi. 2013-02-26 01:50 '13 saat 01:50 2013-02-26 01:50

Modelin problemlərini cildin yağ modellərini modelləşdirmək, həmçinin model kodlarınızı qurutmaq üçün oxudum. Burada nümunələrlə bir izahat var:

1) Model kodlarının qurulması

Məqalə modelini, hadisə modelini və şərh modelini nəzərdən keçirin. Məqalədə və ya hadisədə bir çox şərh var. Şərh yazı və ya hadisəyə aiddir.

Ənənəvi olaraq modellər bu şəkildə görünə bilər:

Şərh modeli:

 class Comment < ActiveRecord::Base belongs_to :commentable, polymorphic: true end 

Modelin məqaləsi:

border=0
 class Article < ActiveRecord::Base has_many :comments, as: :commentable def find_first_comment comments.first(created_at DESC) end def self.least_commented #return the article with least number of comments end end 

Hadisə modeli

 class Event < ActiveRecord::Base has_many :comments, as: :commentable def find_first_comment comments.first(created_at DESC) end def self.least_commented #returns the event with least number of comments end end 

Görüldüyü kimi, həm hadisələrə, həm də məqaləyə ümumi bir əhəmiyyətli kod var. Problemləri istifadə edərək, bu ümumi kodu ayrı bir Commentable moduluna çıxara bilərik.

Bunu etmək üçün, app / models / problemlərdə commentable.rb faylını yaradın.

 module Commentable extend ActiveSupport::Concern included do has_many :comments, as: :commentable end # for the given article/event returns the first comment def find_first_comment comments.first(created_at DESC) end module ClassMethods def least_commented #returns the article/event which has the least number of comments end end end 

İndi modelləriniz belə görünür:

Şərh modeli:

 class Comment < ActiveRecord::Base belongs_to :commentable, polymorphic: true end 

Modelin məqaləsi:

border=0
 class Article < ActiveRecord::Base include Commentable end 

Hadisə modeli:

 class Event < ActiveRecord::Base include Commentable end 

2) Bədən yağının simulyasiyası.

Hadisənin modelini nəzərdən keçirin. Tədbirdə bir çox qonaq və şərh var.

Bir qayda olaraq, hadisə modeli belə ola bilər:

 class Event < ActiveRecord::Base has_many :comments has_many :attenders def find_first_comment # for the given article/event returns the first comment end def find_comments_with_word(word) # for the given event returns an array of comments which contain the given word end def self.least_commented # finds the event which has the least number of comments end def self.most_attended # returns the event with most number of attendes end def has_attendee(attendee_id) # returns true if the event has the mentioned attendee end end 

Bir çox dərnəkləri olan modellər və daha çox miqdarda kod yığmaq və idarə olunmayan vəziyyətdədirlər. Qidalanma, yağ modullarının hamarlaşdırılmasının bir yoludur və onları daha modul və anlaşılır hala gətirir.

Yuxarıdakı model aşağıda göstərilən problemlərdən istifadə edərək yenidən təşkil edilə bilər: applications / models / problems / events qovluğunda attendable.rbcommentable.rb faylını yaradın

attendable.rb

 module Attendable extend ActiveSupport::Concern included do has_many :attenders end def has_attender(attender_id) # returns true if the event has the mentioned attendee end module ClassMethods def most_attended # returns the event with most number of attendes end end end 

yorumable.rb

 module Commentable extend ActiveSupport::Concern included do has_many :comments end def find_first_comment # for the given article/event returns the first comment end def find_comments_with_word(word) # for the given event returns an array of comments which contain the given word end module ClassMethods def least_commented # finds the event which has the least number of comments end end end 

İndi narahatlıqlardan istifadə edərək, hadisə modeliniz aşağı gəlir

 class Event < ActiveRecord::Base include Commentable include Attendable end 

* Problemləri istifadə edərkən, bir "texniki" qruplaşdırma deyil, bir domen əsaslı qruplaşmanın istifadə edilməsi məsləhətdir. Domain əsaslı qruplaşdırma "Yorumlanabilir", "Fotoqrafik", "Davamlı" kimidir. Texniki qruplaşma, "ValidationMethods", "FinderMethods" və s. Deməkdir.

363
16 сент. Cavab 16 sentyabrda Aaditi Jain tərəfindən verilir . 2014-09-16 01:50 '14 da 1:50 2014-09-16 01:50

Çoxlu problemlərdən istifadə etmək pis bir fikir sayılır.

Bəzi səbəblər:

  • Səhnələri arxasında gedən bəzi qaranlıq sehrlər var. Məsələ buraxılış metodunu düzəldir, bir bütövlükdə asılılıq idarə sistemi var - bir çətin köhnə Ruby nümunəsi qarışığı olan bir şey üçün çox çətin bir vəzifədir.
  • Dərsləriniz az quru deyil. 50 ictimai metodu müxtəlif modullarda yerləşdirir və onlara imkan verirsə, sinifdə hələ də 50 ictimai metod var, yalnız bu kodun qoxusunu, məsələn, zibil qutularına qoymaq kimi.
  • Codebase bütün bu problemlərlə dolaşmaq üçün daha çətindir.
  • Komandanızın bütün üzvləri narahatlığı dəyişdirməlidir ki, eyni anlayışa sahib olduğuna əminsinizmi?

Diqqət, ayaqda vurmaq üçün asan bir yoldur, onlarla diqqətli olun.

91
23 марта '15 в 17:11 2015-03-23 17:11 Dr. Strangelove tərəfindən 23 Mart ' 17' də saat 17:11 ' də cavab verildi

Bu mesaj mənə problemləri başa düşdü.

 # app/models/trader.rb class Trader include Shared::Schedule end # app/models/concerns/shared/schedule.rb module Shared::Schedule extend ActiveSupport::Concern ... end 
54
17 марта '13 в 22:20 2013-03-17 22:20 cavab 17 mart 'da saat 22: 20-da veriləcək

Mən burada nümunələrin əksəriyyətinin bir module gücünü nümayiş etdirdiyini və bir ActiveSupport::Concern module necə dəyər verdiyini hiss etdim.

Məsələn: Daha oxunan modullar.

Belə ki, heç bir problem, tipik bir module necə olacaq.

 module M def self.included(base) base.extend ClassMethods base.class_eval do scope :disabled, -> { where(disabled: true) } end end def instance_method ... end module ClassMethods ... end end 

ActiveSupport::Concern ilə ActiveSupport::Concern etdikdən sonra.

 require 'active_support/concern' module M extend ActiveSupport::Concern included do scope :disabled, -> { where(disabled: true) } end class_methods do ... end def instance_method ... end end 

Bu nümunə metodları, sinif metodları və daxil olan blok az kirli olduğunu görürsünüz. Problemlər bunları sizə görə təqdim edəcək. ActiveSupport::Concern istifadə etmək üstünlüklərindən biridir.


Məsələn 2: Modul bağımlılıklarının zərif idarə edilməsi.

 module Foo def self.included(base) base.class_eval do def self.method_injected_by_foo_to_host_klass ... end end end end module Bar def self.included(base) base.method_injected_by_foo_to_host_klass end end class Host include Foo # We need to include this dependency for Bar include Bar # Bar is the module that Host really needs end 

Bu nümunədə Bar Host həqiqətən ehtiyacı olan moduldur. Amma Bar Foo asılı olduğundan, Host sinifində include Foo (lakin gözləyin, Host nə üçün Foo haqqında bilmək Foo ki, bunun qarşısını almaq olar?).

Beləliklə, Bar harada olursa olsun, asılılığı artırır. Və burada daxil edilmə qaydası da vacibdir. ** Bu böyük bir kod bazasına bir çox mürəkkəblik / asılılıq əlavə edir.

ActiveSupport::Concern ilə ActiveSupport::Concern etdikdən sonra

 require 'active_support/concern' module Foo extend ActiveSupport::Concern included do def self.method_injected_by_foo_to_host_klass ... end end end module Bar extend ActiveSupport::Concern include Foo included do self.method_injected_by_foo_to_host_klass end end class Host include Bar # It works, now Bar takes care of its dependencies end 

İndi asan görünür.

Düşünürsəniz, niyə Foo bağımlılığını Bar modulunun özünə əlavə edə bilmirik? Bu, işləməyəcək, çünki method_injected_by_foo_to_host_klass Bar daxil olmaqla, Bar .

Mənbə: Rails ActiveSupport :: Concern

31
03 дек. cavab shiva 03 dek verilir . 2015-12-03 12:11 '15 'da 12:11' de, 2015-12-03 12:11

Filename.rb faylını yaratmaqla əlaqədar

Məsələn, mənim ərizəmdə, özəllik yaratdıqda, yeniləmə üçün 1 və 0-da bir yeniləmə var

 class Role < ActiveRecord::Base include TestConcern end 
6
15 янв. Cavab 15 yanvarda Sajjad Murtaza tərəfindən verilir . 2015-01-15 11:45 '15 saat 11:45 'də 2015-01-15 11:45

haqqında digər suallar və ya bir sual