Apsaugoti ir privatūs metodai Rails

Ruby metodų matomumas (viešieji, saugomi ir privatūs metodai) buvo gerai paaiškintas tokiose vietose kaip šis dienoraščio įrašas . Bet Ruby on Rails, atrodo, šiek tiek skiriasi nuo įprastos Ruby programos, nes struktūra yra sukonfigūruota. Taigi, bėgių, valdiklių, pagalbininkų, testų ir kt. Modeliuose, kada / ar jis netinka naudoti apsaugotus ar privačius metodus?

Keisti . Dėkojame už atsakymus. Suprantu saugaus ir privataus „Ruby“ sąvoką, bet aš labiau ieško, kaip paaiškinti tipišką šių matomumo tipų naudojimą įvairiose „Rails“ programos dalyse (modeliai, valdikliai, pagalbininkai, bandymai). taikomųjų programų valdikliai naudojami „pagalbiniams metodams“, kuriuos turi pasiekti keli valdikliai ir tt

72
21 дек. nustatė jrdioko 21 d. 2010-12-21 02:45 '10, 2:45 val. 2010-12-21 02:45
@ 5 atsakymai

Modelių idėja yra ta, kad viešieji metodai yra atviros klasės sąsaja. Viešieji metodai skirti naudoti kitiems objektams, o saugomi / privatūs metodai turi būti užslėpti.

Tai ta pati praktika kaip ir kitoms objekto kalboms.

Kontrolieriams ir tiesiog atlikite, kaip prašome. Abi kontrolieriaus bandymų klasės sukuriamos ir skambinamos tik pagal sistemą ( taip, žinau, kad teoriškai jūs galite gauti valdytoją iš požiūrio, bet jei tai padarysite, kažkas yra keista, bet kokiu atveju). Kadangi niekas nesukurs šių dalykų tiesiogiai, nėra nieko „saugoti“.

„Add / Bugfix“ (papildymas / klaidų ištaisymas): valdytojams turite pažymėti pagalbinius metodus kaip apsaugotus privačius, o tik patys veiksmai turi būti viešai prieinami. Struktūra niekada nesieks jokių įeinančių HTTP skambučių į veiksmus ar metodus, kurie nėra viešai prieinami, todėl jūsų pagalbininkų metodai turėtų būti tokiu būdu apsaugoti.

Padėjėjams nėra prasmės, jei metodas yra apsaugotas ar uždarytas, nes jie visada vadinami „tiesiogiai“.

Jūs galite pažymėti apsaugotą medžiagą visais šiais atvejais, jei tai padės jums suprasti, žinoma.

91
05 янв. atsakymą pateikė averell 05 jan. 2011-01-05 20:47 '11 prie 20:47 2011-01-05 20:47

Jei norite, kad šis metodas nebūtų naudojamas, naudokite privatų metodą. Jūs naudojate apsaugotą metodą, jei norite kažko, kas gali skambinti tik self and is_a?(self) .

Gera apsauga nuo saugojimo gali būti, jei turite „virtualų“ inicijavimo metodą.

 class Base def initialize() set_defaults() #other stuff end protected def set_defaults() # defaults for this type @foo = 7 calculate_and_set_baz() end private def calculate_and_set_baz() @baz = "Something that only base classes have like a file handle or resource" end end class Derived < Base protected def set_defaults() @foo = 13 end end 
border=0

@foo turės skirtingas reikšmes. ir išvestiniai atvejai nebus @ baz

Atnaujinimas: Kadangi parašiau tai, kai kurie dalykai pasikeitė Ruby 2.0+. Aaronas Pattersonas parašė puikią http://tenderlovemaking.com/2012/09/07/protected-methods-and-ruby-2-0.html

56
21 дек. Atsakymą pateikė „ EnabrenTane “ gruodžio 21 d. 2010-12-21 03:08 '10, 03:08, 2010-12-21 03:08

Skirtumas tarp saugių ir privačių plonų. Jei metodas gali būti vadinamas bet kuria apibrėžiančios klasės ar jos poklasio instancija. Jei metodas yra privatus, jį galima skambinti tik skambinančiojo objekto kontekste - jis niekada tiesiogiai nepasiekia kito objekto, net jei objektas yra tos pačios klasės kaip skambintojas. Saugomų metodų atveju jie pasiekiami iš tos pačios klasės (arba vaikų) objektų.

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Declaring_Visibility

9
21 дек. Atsakymas pateikiamas nunopolijos 21 d. 2010-12-21 02:54 '10, 2:54, 2010-12-21 02:54

Nors veiksmai turi būti viešieji duomenų valdytojo metodai, ne visi viešieji metodai būtinai yra veiksmai. Galite naudoti hide_action jei naudojate bendrą maršrutą, pvz., hide_action /:controller/:action/:id , arba jei jis yra išjungtas (pagal nutylėjimą 3 rėmuose), bus vadinami tik aiškių maršrutų metodai.

Tai gali būti naudinga, jei perkeliate valdiklio pavyzdį į kitą biblioteką, pvz., Skystojo šablono variklį, nes galite pateikti viešą sąsają, o ne naudoti skystųjų filtrų ir žymų pateikimą.

2
07 янв. atsakymą pateikė „ pixeltrix“ sausio 7 d 2011-01-07 14:36 '11 at 14:36 2011-01-07 14:36

Atrodo, kad esate gerai išmanantis klasės matomumo (viešojo / saugomo / privataus) semantiką metodų atžvilgiu. Viskas, ką galiu pasiūlyti, yra trumpas aprašymas, kaip jį įgyvendinti savo „Rails“ programose.

Apsaugotus metodus įdiegiu programos pagrindiniame valdiklyje, kad juos galėtų skambinti bet kuris valdiklis per filtrus (pvz., Prieš_filtrą: method_foo). Panašiai apibrėžiu modelius, kuriuos noriu naudoti visuose pagrindinio modelio, iš kurio jie visi paveldėjo, saugomus metodus.

2
04 янв. atsakymas duotas Sasha 04 jan. 2011-01-04 10:09 '11, 10:09, 2011-01-04 10:09