mám BaseController
že chcem superclass ďalšie ovládače s. Ja tiež superclass niektoré ovládače s normou ApplicationController
.
Môžem napríklad:
class AController < ApplicationController
end
rovnako ako aj...
class BController < BaseController
end
Pri testovaní niekedy potrebujem vytvoriť ľubovoľnú "falošnú" alebo "falošnú" triedu na testovanie pred filtrom, modulom atď. Nechcem to často robiť, ale niekedy je to užitočné.
Vytvoril som jeden v mojich špecifikáciách takto:
class FakeController < ApplicationController
end
To je v poriadku.
Teraz však musím vytvoriť ďalšiu z nich FakeController
triedy, ale tentoraz ako moja podtrieda BaseController
trieda.
Bohužiaľ FakeController
konštanta je už zaregistrovaná a ja dostávam chyby v nadradenej chybe.
Nechcem robiť niečo podobné FakeController2
- ako si myslím, že to otvára zlú plechovku červov.
Nejaké návrhy?
odpovede:
0 pre odpoveď č. 1Nevidím problém s používaním FakeController2
alebo akýkoľvek iný názov, ale jediná verejná alternatíva, o ktorej si myslím, je predstaviť modul tak, aby bol druhý FakeController
existuje v inom mennom priestore, ako v:
module Foo
class FakeController < ApplicationController
end
end
Existuje súkromná metóda remove_const
definované na Kernel
ktoré možno použiť na zrušenie registrácie konštanty z objektu. Takže, ak FakeController
je definovaná na Object
, môžete ho zrušiť registrovaním hovoru:
Object.send(:remove_const, :FakeController)
V tomto bode môžete definovať konštantu znova tak, ako keby ste nikdy neboli nikdy definovaní na prvom mieste. (Pamätajte: Ruby je interpretovaný jazyk.)
0 pre odpoveď č. 2
Alternatívou k podradzovaniu vašich radičov je použiť mechanizmus anonymného regulátora poskytnutá klenotom rspec-rail.