Atskiri JS failai kiekvienam kontroleriui

Kažkur (berods pixel.lt) skaičiau palyginimus tarp programavimo kalbų/karkasų bei statybų. Ruby On Rails atiteko frazė panaši į “jeigu ir statyti, tai iš karto metropolį”.

Tikra tiesa, kuo labiau didėjant aplikacijai - didėja visas JS kodas (juolab jeigu naudojate prototype ir scriptaculous bibliotekas). Tokiu atveju visos funkcijos naudojamos įvairiuose kontrolerių šablonuose turi būti grūdamos į vieną failą skirtą tokioms reikmėms (application.js). Atskirai kurti layout:us (?išdėstymus?) kiekvienam kontroleriui (su atskiru js failo įtraukimu) būtų netikslinga, o turint vieną layout:ą, su sąlyga tikrinti kokį js failą įtrauktį būtų tikras košmaras (generuojant naują kontrolerį - darašintėti dar sąlygų). Susigalvojau šiek tiek automatizavimo, kad viename layout:e būtų automatiškai įtraukiamas to kontrolerio js failas.

Taigi pradžioje buvo layout:as (application.html.erb):

...
< %= javascript_include_tag :defaults %>
< %= javascript_include_tag controller.controller_name %>
...

Dabar yra du būdai pateikti js failą kiekvienam kontroleriui:

  1. Įdėti bylą į /public/javascripts/ katalogą
  2. Sukurti atskirą šabloną kiekvienam js failui kiekvieno kontroerlio šablonų kataloge (/app/views/controller/javascript.js.erb)

Su pirmu būdų viskas kaip ir aišku. Su antru teks truputį dar padirbėti. Sukūrus bylą kontrolerio šablonų kataloge, pats js kodas bus prieinamas /controller/javascript.js adresu, tačiau šis kelias nėra įtraukiamas, kaip js kodo šaltinis layout:e naudojant javascript_include_tag pagalbinį metodą (mol helper).

Reikia patvarkyti /config/routes.rb bylą:

...
map.javascripts '/javascripts/:controller.js', :action => 'javascripts'
...

Dabar kiekvienam kontroleriui parašome po metodą, kuris “aptarnaus” šabloną.

...
def javascript
  # esu įsitikinęs, kad galima tai parašyti kažkur,
  # kad nereikėtų to kartoti kiekviename kontroleryje
  headers['Content-type'] = 'text/javascript'
end
...

Kolkas tiek. Dar į temą galite pasižiūrėti apie JS kešavimą čia, o po to čia.

5 Responses to “Atskiri JS failai kiekvienam kontroleriui”

  1. Valio! \o/ Tvarka bus! Tikesimes viskas veiks kaip veike.

  2. velne Says:

    jei aktualu greitis ir javascriptinių failų nenaudoji kaip šablonų, tai verčiau į javascripto servinimą nevelt railsų ir generuoti script tagus patikrinus ar egzistuoja controlleris.js ir teservina juos nginx/lighttpd/..

    be to, naudojant tokį būdą gali kilt (nebūtinai) problemų jei po deploy’mento į production aplinką visi javascript failai turi automatiškai būt minify’inami (ar kaip nors kitaip spaudžiami).

  3. Eimantas Says:

    velne, jeigu iš tiesų egzistuoja failas controller.js (ar bet koks kitas failas, šiuo atveju) tai jis būna pateikiamas prieš užklausai patenkant į railsų dispečerį, nes tam dalykui yra .htaccess failas, kuris tikrina ar egzistuoja fizinis failas į kurį yra kreipiamasi.

  4. velne Says:

    Nenaudoju apache, bet tas man visiškai aišku. Gal ne visai supratai mano siūlymą. Norėjau pasakyt, kad javascripts dir’e laikyt pačiam susidėjus controlleris.js failus, o generuojant puslapius layoute kažkas panašaus į:
    ,
    kur
    def javascript_include_modular(controller)
    if File.exists?(”#{RAILS_ROOT}/public/javascripts/#{controller}.js”)
    return javascript_include_tag(”#{controller}”)
    end
    end

    kodas /- iš lempos.

  5. [...] šiam savaitgaliui: Extending Firebug, Hello World! (Part I.) Atskiri JS failai kiekvienam kontroleriui jQuery for Designers IE8 Version Targeting: Microsoft Considers Feedback Color Rendering [...]

Leave a Reply