2013-11-21 2 views
0

У меня есть простое приложение Play, в котором мне нужно проверить URL-адрес, который вызывается, и использовать соответствующую базу данных соответственно. Я знаю, что легко получить доступ к текущему URL-адресу контроллера, но для этого мне нужно получить доступ к нему в модели.Scala/Play: доступ к текущему URL-адресу в модели

Передача URL-адреса от контроллера до каждого вызова метода модели была бы слишком большой неудобства. Есть ли другой способ решить эту проблему?

Play Framework 2.2.1/Scala 2.10.3

UPDATE: Это мой основной пример

Controller (Application.scala):

package controllers 

import play.api._ 
import play.api.mvc._ 

import models.Data 

object Application extends Controller { 

    def index = Action { 
     //Call to model method - model should somehow get the URL without it being passed as a param   
     val smth: String = Data.getSmth() 
     Ok(smth); 
    } 

} 

Модель (Data.scala):

package models 

object Data { 

    def getSmth: Option[String] = DB.withSession { 
     val db = //this is where I need the url to decide which database to use 
     sql"""SELECT #$db.smth FROM smthTable""".as[String].firstOption 
    } 

} 
+0

Я не считаю возможным доступ к текущему URL-адресу в модели. Потому что модель не имеет ничего общего с http. Может быть, вы можете определить неявный параметр запроса в своем конструкторе модели. Но я не думаю, что это хороший идеал. – jilen

+0

@jilen Как бы определить этот параметр в моем конструкторе модели? Мне все равно нужно передать его или получить к нему доступ. Неужели такая ситуация не должна быть необычной? – Caballero

+0

'' 'case class Foo (val bar: Int, val baz: String) case object Foo { def apply (bar: Int) (неявный запрос: play.api.mvc.Request [_]) = новый Foo (bar, request.path) } '' 'что-то нравится, это действительно не очень хорошая идея. – jilen

ответ

1

Итак, это по дизайну в API Play Scala - нет волшебного контекста, если вам нужны данные, вам нужно будет передать его на любой фрагмент своего кода, который ему нужен.

Вам придется взять URL в качестве параметра какой-то, вы могли бы сделать это следующим образом:

case class MyModel(someData: String, requestUrl: String) 

object MyModel { 
    def apply(someData: String, request: Request) = 
    new MyModel(someData, request.url) 
} 

Это ясно выразить зависимость, но в вашем конкретном приложении вы могли бы назвать это с каждым запросить и не пытаться повторить предоставление этого параметра, в этом случае вы можете использовать Scala implicits, что заставляет компилятор искать соответствующий неявный экземпляр, который имеет тот же тип в текущей области (вы можете узнать об этом подробнее: http://www.scala-lang.org/old/node/114).

object MyModel { 
    def apply(someData: String)(implicit request: Request) = 
    new MyModel(someData, request.url) 
} 

, который затем может быть вызвана из действия контроллера, как этот

def myAction = Action { implicit request => 
    val model = MyModel("blablabla") 
    ... 
} 

Конечно, это может быть плохой идеей, чтобы плотно пара модели к игровому Request API, и вы, вероятно, следует ввести свой собственный класс для представления этого «контекста», вы могли бы затем неявно конвертировать из Request в YourContext в ваши контроллеры и вместо этого использовать модель неявно использовать YourContext.

Если все это звучит как тарабарщина, вы должны начать с изучения Скалы, прежде чем пытаться создать веб-приложение в Scala. В настоящее время есть много хороших книг (например, «Scala for the impatient»), а также множество хороших онлайн-ресурсов (the neophytes guide to scala - это хороший).

Удачи вам!

+0

Я знаю достаточно Scala, чтобы соскрести CRUD-приложение, но это все еще запутывает. Я обновил свой вопрос своим примером, очевидно, с двумя пробелами, которые суть мой вопрос. – Caballero

+0

Хорошо, прочитав обновленный вопрос, мой ответ все тот же, вы не можете передавать данные функции в scala любым другим способом, чем передавать ее в качестве параметра. – johanandren

+0

Трудно поверить, что Play не может делать то, что может сделать любая shitty PHP MVC framework. Хорошо, если вы говорите, что это невозможно, я думаю, это невозможно. – Caballero

Смежные вопросы