2016-10-04 2 views
0

Я нашел несколько ответов в Интернете по моей проблеме, но все для более старых версий игры, которые больше не работают.переменные в представлениях воспроизведения

Я пытаюсь найти способ использования переменной как части пути к шаблону. Я понимаю, что это приведет к удалению проверки типов и т. Д., Но для генератора/прототипа/внутреннего инструмента и не является чем-то, что увидит общественность/внешний мир.

вот codez:

Лучший ответ я могу найти как произведение вокруг:

def index(page: String) = Action { 
    page match { 
     case "something" => Ok(views.html.examples.something()) 
     case "else" => Ok(views.html.examples.else()) 
     case "another" => Ok(views.html.examples.elements.another()) 
    } 
} 

идеально что-то, как это было больше смысла:

def index(page: String) = Action { 
    Ok(views.html.getClassFromStringOrSomething(page)); 
} 

Я использую новейшая игровая платформа (2.5. *) с scala.

использует матч только в одном направлении? Должно быть динамично, почему нужно возвращать представление?

n.b. Я нашел множество предложений в Интернете, которые используют play.api.templates.Html/play.twirl.api.Html, которые, похоже, больше не работают, Html не могут быть найдены, поэтому я предполагаю, что у api есть другие версии.

С помощью этого я получаю:

def index(page: String, parent: String) = Action { 

    val clazz: Class[_] = Play.current.classloader.loadClass(page) 
    val render: Method = clazz.getDeclaredMethod("render") 
    val view = Some(render.invoke(clazz).asInstanceOf[play.twirl.api.Html]) 
    Ok(view) 
} 

Это дает мне ошибку Cannot write an instance of Some[play.twirl.api.Html] to HTTP response. Try to define a Writeable[Some[play.twirl.api.Html]] и это, где я застрял

+0

FYI: 'play.api.templates.Html' изменен на' play.twirl.api. Html' (Twirl - это название механизма шаблонов, который был выделен из Play.) – Mikesname

+0

Как вы ожидаете предоставить argume nts к этим динамическим представлениям? Вероятно, вам лучше всего использовать совершенно другой шаблонный движок, такой как [Jtwig] (http://jtwig.org/). Игра не привязана к Twirl - это просто значение по умолчанию. – Mikesname

+0

аргументы будут динамической частью URL-адреса. Представьте, что у меня есть 1000 предварительно сделанных вихревых представлений, все названные в соответствии с там url. Я не хочу добавлять контроллер/матч для каждого из них. – atmd

ответ

0

Я добавил ответ здесь только, чтобы помочь кто-то бил этот вопрос ,

@Минимальное имя было правильным, удалите Some(), и все должно работать нормально.

Проблема заключалась в том, что я динамически загружал имя класса/вида, но я не использовал полное имя класса. Я загружал something, когда я должен был загружать view.html.something.

Heres код, который я использовал, чтобы получить функцию рабочего (потребности очистки, но он работает, а также счета для представлений имени index внутри каталога, т.е. views.html.parent -> /parent/index.scala.html

package controllers 

import javax.inject.{Inject, Singleton} 

import play.api.Play 
import play.api.mvc.{Action, Controller} 

import play.twirl.api.Html 

@Singleton 
class PathController @Inject() extends Controller { 

    def index(page: String, parent: String, grandparent: String) = Action { 
    Ok(buildView(buildClassName(page, parent, grandparent))) 
    } 

    def buildClassName(page: String, parent: String, grandparent: String): String = { 
    val pathGrandParent = if (grandparent != null) grandparent + '.' else "" 
    val pathParent = if (parent != null) parent + '.' else "" 

    "views.html." + pathGrandParent + pathParent + page 
    } 

    def loadClass(name: String): Class[_] = { 
    try { 
     Play.current.classloader.loadClass(name) 
    } catch { 
     case _: Throwable => { 
      Play.current.classloader.loadClass(name + ".index") 
     } 
    } 
    } 

    def buildView(name: String): Html = { 
    val clazz = loadClass(name) 
    clazz.getDeclaredMethod("render").invoke(clazz).asInstanceOf[play.twirl.api.Html] 
    } 
} 

Я бы себе представить, что есть гораздо лучший способ сделать часть индекса, а затем попробовать/поймать, но это прекрасно для инструмента, который я создаю.

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