शायद मैं कुछ स्पष्ट दिख रहा हूं लेकिन मुझे पता नहीं लगा सकता कि प्ले कंट्रोलर में एक फॉर्म फ़ील्ड को डबल में कैसे बांधना है।प्ले: एक फॉर्म फ़ील्ड को दो बार बांधें?
उदाहरण के लिए, मान लेते हैं कि यह मेरा मॉडल है:
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 के लिए निम्न जोड़ा
धन्यवाद! यह पूरी तरह से काम करता है। अगर कोई और इस पर ठोकर खाए तो मैं अपने मूल प्रश्न को अपने समाधान के साथ अपडेट कर दूंगा। – Ryan
इस लेखन के अनुसार, 'डबलफॉर्मैट' का लिंक यहां है https://github.com/playframework/playframework/blob/b7c414ef11a1a8befa0caa8dbc52fa4e11128a08/framework/src/play/src/main/scala/play/api/data/format/ Format.scala # L132 (प्रो टिप: एक विशेष प्रतिबद्धता से बंधे परमलिंक प्राप्त करने के लिए जिथब में "y" दबाएं। चूंकि "मास्टर" समय के साथ चलता है, मास्टर-आधारित लिंक समय के साथ सड़ जाते हैं।) –