2017-01-22 8 views
7

के बजाय स्केलैटैग का उपयोग करें, मैं बाद में पूर्व में उपयोग करना पसंद करूंगा, लेकिन मुझे यकीन नहीं है कि प्लेफ्रेमवर्क में स्केलैटैग को कैसे शामिल किया जाए।प्लेफ्रेमवर्क: ट्वर्ल

यह मेरा सरल लेआउट है:

object Test 
{ 
    import scalatags.Text.all._ 
    def build = 
    { 

    html(
     head(
     title := "Test" 
    ), 
     body(

     h1("This is a Triumph"), 
     div(
      "Test" 
     ) 
    ) 
    ) 
    } 
} 

यह वह जगह है मैं इसे कैसे प्रस्तुत करने के लिए प्रयास करें:

Ok(views.Test.build.render) 

समस्या HTML के रूप में नहीं है कि मैं एक सादे स्ट्रिंग के रूप में यह मिलता है, है।

अब, निश्चित रूप से एक समाधान केवल संलग्न करना होगा।

Ok(views.Test.build.render).as("text/html") 

लेकिन क्या यह वास्तव में एकमात्र तरीका है? (एक सहायक विधि बनाने के बिना)

उत्तर

9

मुझे लगता है कि आप Ok(views.Test.build) पर कॉल करने में सक्षम होना चाहते हैं। Play ScalaTags से अनजान है इसलिए हमें कुछ लिखना होगा।

Play HTTP प्रतिक्रिया उत्पन्न करने के लिए कुछ अंतर्निहित मशीनरी का उपयोग करता है। जब आप Ok(...) पर कॉल करते हैं तो आप वास्तव में पर play.api.mvc.Results विशेषता पर कॉल कर रहे हैं। के उसके हस्ताक्षर पर एक नज़र लेते हैं:

def apply[C](content: C)(implicit writeable: Writeable[C]): Result 

तो हम देख सकते हैं कि हम एक अंतर्निहित Writeable[scalatags.Text.all.Tag] की जरूरत है:

implicit def writeableOfTag(implicit codec: Codec): Writeable[Tag] = { 
    Writeable(tag => codec.encode("<!DOCTYPE html>\n" + tag.render)) 
} 

मत भूलना एक doctype घोषणा शामिल करने के लिए। ScalaTags आपको एक नहीं देता है।

Writeable.apply पर कॉल करने के लिए स्वयं को सामग्री प्रकार निर्धारित करने के लिए एक और निहितार्थ की आवश्यकता होती है। यहाँ अपने हस्ताक्षर है:

def apply[A](transform: A => ByteString)(implicit ct: ContentTypeOf[A]): Writeable[A] 

तो चलो बारे में एक अंतर्निहित ContentTypeOf[Tag]:

implicit def contentTypeOfTag(implicit codec: Codec): ContentTypeOf[Tag] = { 
    ContentTypeOf[Tag](Some(ContentTypes.HTML)) 
} 

यह हमें as("text/html") स्पष्ट और लिखने के लिए (अंतर्निहित कोडेक के सौजन्य से) यह चारसेट शामिल होने से बचने के लिए अनुमति देता है , जिसके परिणामस्वरूप text/html; charset=utf-8 का शीर्षलेख हुआ।

यह सबको एक साथ रखें:

import play.api.http.{ ContentTypeOf, ContentTypes, Writeable } 
import play.api.mvc.Results.Ok 
import scalatags.Text.all._ 

def build: Tag = { 
    html(
    head(
     title := "Test" 
    ), 
    body(

     h1("This is a Triumph"), 
     div(
     "Test" 
    ) 
    ) 
) 
} 

implicit def contentTypeOfTag(implicit codec: Codec): ContentTypeOf[Tag] = { 
    ContentTypeOf[Tag](Some(ContentTypes.HTML)) 
} 

implicit def writeableOfTag(implicit codec: Codec): Writeable[Tag] = { 
    Writeable(tag => codec.encode("<!DOCTYPE html>\n" + tag.render)) 
} 

def foo = Action { implicit request => 
    Ok(build) 
} 

आप शायद कहीं सुविधाजनक उन implicits टक और फिर उन्हें अपने नियंत्रक (रों) में आयात करना चाहते हैं।

+3

क्यों घुमाव खेल में डिफ़ॉल्ट टेम्पलेट इंजन है? स्केलटैग सरल लगता है। – BlueSky

संबंधित मुद्दे