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. Sergej 'ZaZa' Kurakin

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

  2. velne

    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

    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

    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. Savaitgalio skaitiniai #54 » Pixel.lt

    [...] š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