2012-10-06 10 views
10

शायद मैं कुछ स्पष्ट दिख रहा हूं लेकिन मुझे पता नहीं लगा सकता कि प्ले कंट्रोलर में एक फॉर्म फ़ील्ड को डबल में कैसे बांधना है।प्ले: एक फॉर्म फ़ील्ड को दो बार बांधें?

उदाहरण के लिए, मान लेते हैं कि यह मेरा मॉडल है:

case class SavingsGoal(
timeframeInMonths: Option[Int], 
amount: Double, 
name: String 
) 

(ध्यान न दें कि मैं पैसे के लिए एक डबल उपयोग कर रहा हूँ, मुझे पता है कि एक बुरा विचार है, यह सिर्फ एक सरल उदाहरण है)

और मैं तो जैसे यह बाध्य करने के लिए चाहता था:

object SavingsGoals extends Controller { 

    val savingsForm: Form[SavingsGoal] = Form(

     mapping(
      "timeframeInMonths" -> optional(number.verifying(min(0))), 
      "amount" -> of[Double], 
      "name" -> nonEmptyText 
     )(SavingsGoal.apply)(SavingsGoal.unapply) 

    ) 

} 

मैंने महसूस किया कि number सहायक केवल ints लिए काम करता है, लेकिन मैं of[] का उपयोग कर मुझे एक बाध्य करने के लिए अनुमति दे सकते हैं सोचा डबल। हालांकि, मैं इस पर एक संकलक त्रुटि मिलती है:

Cannot find Formatter type class for Double. Perhaps you will need to import 
play.api.data.format.Formats._ 

ऐसा करने से के रूप में कोई डबल फ़ॉर्मेटर एपीआई में परिभाषित मदद नहीं करता है।

यह सिर्फ यह पूछने का एक लंबा तरीका है कि एक फॉर्म फ़ील्ड को बाध्य करने का कैननिकल तरीका क्या है?

धन्यवाद!

संपादित करें: 4e6 ने मुझे सही दिशा में इंगित किया। यहाँ मैं उसकी मदद का उपयोग कर क्या किया है:

object Global { 

    /** 
    * Default formatter for the `Double` type. 
    */ 
    implicit def doubleFormat: Formatter[Double] = new Formatter[Double] { 

     override val format = Some("format.real", Nil) 

     def bind(key: String, data: Map[String, String]) = 
     parsing(_.toDouble, "error.real", Nil)(key, data) 

     def unbind(key: String, value: Double) = Map(key -> value.toString) 
    } 

    /** 
    * Helper for formatters binders 
    * @param parse Function parsing a String value into a T value, throwing an exception in case of failure 
    * @param error Error to set in case of parsing failure 
    * @param key Key name of the field to parse 
    * @param data Field data 
    */ 
    private def parsing[T](parse: String => T, errMsg: String, errArgs: Seq[Any])(key: String, data: Map[String, String]): Either[Seq[FormError], T] = { 
     stringFormat.bind(key, data).right.flatMap { s => 
     util.control.Exception.allCatch[T] 
      .either(parse(s)) 
      .left.map(e => Seq(FormError(key, errMsg, errArgs))) 
     } 
    } 

} 

फिर, मेरी प्रपत्र मानचित्रण में:

mapping(
    "amount" -> of(Global.doubleFormat) 
) 
उसकी कड़ी में स्निपेट का उपयोग करना

, मैं app.controllers.Global.scala के लिए निम्न जोड़ा

उत्तर

10

दरअसल, there is मास्टर शाखा पर Double के लिए पूर्वनिर्धारित फॉर्मेटर। तो आपको या तो 2.1-SNAPSHOT प्ले संस्करण पर स्विच करना चाहिए या केवल कार्यान्वयन की प्रतिलिपि बनाना चाहिए।

+0

धन्यवाद! यह पूरी तरह से काम करता है। अगर कोई और इस पर ठोकर खाए तो मैं अपने मूल प्रश्न को अपने समाधान के साथ अपडेट कर दूंगा। – Ryan

+0

इस लेखन के अनुसार, 'डबलफॉर्मैट' का लिंक यहां है https://github.com/playframework/playframework/blob/b7c414ef11a1a8befa0caa8dbc52fa4e11128a08/framework/src/play/src/main/scala/play/api/data/format/ Format.scala # L132 (प्रो टिप: एक विशेष प्रतिबद्धता से बंधे परमलिंक प्राप्त करने के लिए जिथब में "y" दबाएं। चूंकि "मास्टर" समय के साथ चलता है, मास्टर-आधारित लिंक समय के साथ सड़ जाते हैं।) –

11

यदि आपके पास संस्करण 2.1 है तो आपको वैश्विक में प्रारूप का उपयोग करने की आवश्यकता नहीं है।

बस आयात:

import play.api.data.format.Formats._ 

और के रूप में उपयोग:

mapping(
    "amount" -> of(doubleFormat) 
) 
संबंधित मुद्दे