2011-04-14 27 views
8

Sinatra ile çalışan kahve yazılarını almaya çalışıyorum. Her iki teknolojide de yeniyim, bu muhtemelen aptalca bir şey. Benim sorunum coffeescript javascript derler ama sayfa üzerinde yürütmüyor, yerine html olarak görünmektedir. senin örneğin this Sinatra documentation dayanmaktadır gibiSinatra ile coffeescript nasıl kullanılır?

#sinatra app 
require 'coffee-script' 
get "/test.js" do 
    coffee :hello 
end 

#hello.coffee 
alert "hello world" 

#My page (/test.js) doesn't execute the js - just displays the code 

#On screen in the browser I get this: 
    (function() { 
    alert("hello world"); 
}).call(this); 

#In the HTML I get this within the body tags 

<pre style="word-wrap: break-word; white-space: pre-wrap;">(function() { 
    alert('hello world!'); 
}).call(this); 
</pre> 
+0

ne HTML ismi ise "HTML, In" demek? JavaScript'iniz buraya nasıl yerleştirildi? Ayrıca, “merhaba dünya” 'nın“ merhaba çocuklar ”ın üzerinde bir tutarsızlık var. –

+0

"HTML'de" derken, sayfanın kaynağını görüntülediğimde kastediyorum. Tutarsızlık düzeltildi - herhangi bir karışıklık için özür dilerim. –

+0

Doğru, bunu anlıyorum, ama şunu soruyorum: Sinatra'nın ucunda bu sayfayı nasıl yarattın? –

cevap

6

Hmm ... görünüyor. Fakat bazı nedenlerle Sinatra, .js dosyasını HTML olarak sunmaya çalışıyor ve buna göre ön işlem yapıyor. Uygulamanızın herhangi bir yerinde content_type belirleme şansınız var mı? ,

get "/test.js" do 
    content_type "text/javascript" 
    coffee :hello 
end 

Ayrıca tamamen farklı bir yaklaşım deneyebilirsiniz için kodunuzu değiştirme Raf düzeyinde otomatik JavaScript için CoffeeScript derlemeye Rack::Coffee veya Barista kullanarak deneyin. Zaten çok sayıda CoffeeScript dosyası varsa, bu daha kolay olabilir.

Düzeltme: Yukarıdakileri yayınladıktan sonra, muhtemelen sadece işaretlemenizi yanlış yorumladığımı gösterdi. tarayıcınızdan sadece

alert('hello world!'); 

sayfayı test.js yüklediğinizde gördüklerinizi mi? Eğer öyleyse, her şey iyi çalışıyor. JavaScript, tarayıcınızda yalnızca <script> etiketleri arasında bir HTML sayfasında çalışacak veya <script src="test.js"></script> aracılığıyla başvuruda bulunacaktır. Mevcut koduna ek olarak,

get "/alert", :provides => 'html' do 
    '<script type=src="test.js"></script>' 
end 

eklemek Öyleyse tarayıcınızda o alert adresini açın ve komut dosyası çalıştırmak gerekir.

+1

Cevabınız için çok teşekkürler. İkisini de denedim ama yine de hayır şansı - senaryo etiketlerinde olmasa da haklısın.Gördüğüm şey hakkında daha fazla bilgi ekledim. Raf seviyesi çözümlerini deneyebilirsiniz. –

2

Ben genellikle sadece kurulum benim CoffeeScript dosyalarda Gözetmenin coffee -wc dirname/ gelişmekte ve daha sonra üretime derlenen JS dosyalarına dağıtmak iken. İdeal değil, ancak bazı açılardan daha az karmaşıktır ve sinatra-coffee-script-template itibaren ben sadece aynı kurulum arıyordu (benim durumumda Heroku olan.)

+5

Aslında, Ruby's 'kahve-script' gem (şimdi Rails 3.1 bir varsayılan) Node bağımlı değildir. [ExecJS] (https://github.com/sstephenson/execjs) aracılığıyla CoffeeScript'in derleyicisini (bir JavaScript dosyası) çalıştırır ve bu da [therubyracer] 'ı arar (https://github.com/cowboyd/ therubyracer) gem; bağımlılığı olmayan bir JavaScript yorumlayıcısı. Tamamen Heroku dostu. –

+1

Özellikle, [therubyracer-heroku] (https://github.com/aler/therubyracer-heroku). –

+0

evet bu taş kullanışlı geliyor. Daha önce nasıl çalıştığını duymamıştım ama şu an mükemmel bir anlam ifade ediyor (bir colora dayalı javascript yorumlayıcısına sahip javascript için önceden derlenmiş coffeescript) –

3

benim üretim sunucudan node.js bağımlılığını kaldırır. application.coffee

$(document).ready -> 
    $('button:first').click -> 
    $('body').toggleClass 'dark', 'light' 

index.erb

<h1>I'm living the dream</h1> 
<button>Click me</button> 

layout.erb

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title>Sinatra Coffee-Script Template</title> 
    <style type="text/css"> 
    .dark { 
     background: #2F2F2F; 
     color: #7F7F7F; 
    } 
    .light { 
     background: #EEEEEE; 
     color: #2F2F2F; 
    } 
    </style> 
</head> 
<body> 
    <%= yield %> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script> 
    <script src="/javascripts/listeners.js" type="text/javascript"></script> 
</body> 
</html> 
+0

application.js hakkında index.erb veya layout.erb dosyasından bahsetmediniz. Sinatra tarayıcıya atacaktır – coool