2016-11-07 10 views
1

В Vapor, особенно в классе для пользовательского тега Leaf, как вы можете извлекать значения, хранящиеся в контексте?Как получить значения из контекста в Vapor?

Я пытаюсь реализовать тег, который берет строку и путь, и отображает ссылку, если только путь не является текущей страницей, поэтому, например, #navElement("About Us", "/about") создаст ссылку на страницу сайта на каждой странице кроме самой страницы. На этой странице он должен отображать текст без ссылки на него.

Я не хочу, чтобы пройти текущий путь к тэгу каждый раз, когда я использую его, поэтому я хранится путем просьбы в контексте, примерно так (чеки опущенных):

drop.get(":page"){ request in 
    return try drop.view.make(thePage, ["path": request.uri.path]) 
} 

Я могу использовать #(path) в шаблоне и видеть путь, который я ожидаю.

Мой пользовательский тег получен из Tag, а его метод run принимает контекст как аргумент, и я могу видеть сохраненное значение там в отладчике, но как я могу его получить? Метод get в классе Context, который, кажется, делает это, равен internal, поэтому я не могу его использовать. Есть комментарий, в котором говорится, что индексы должны быть выполнены, и я предполагаю, что это в конечном итоге будет способом извлечения значений из контекста, но тем временем, есть ли способ их получить?

ответ

0

Просто введите текущий path один из аргументов в ваш тег.

Капелька маршрут:

drop.get(":page") { request in 
    return try drop.view.make(thePage, ["currentPath": request.uri.path]) 
} 

В шаблоне:

#navElement("About Us", "/about", currentPath) 

Тэг:

class NavElement: Tag { 

    let name = "navElement" 

    public func run(stem: Stem, context: LeafContext, tagTemplate: TagTemplate, arguments: [Argument]) throws -> Node? { 
    guard 
     let linkText = arguments[0].value?.string, 
     let linkPath = arguments[1].value?.string, 
     let currentPath = arguments[2].value?.string 
    else { return nil } 
    if linkPath == currentPath { 
     return Node("We are at \(currentPath)") 
    } else { 
     return Node("Link \(linkText) to \(linkPath)") 
    } 
    } 

} 

Edit:

Я разговаривал с разработчиками Vapor, и они не намереваются открывать ac дословно до контекстного контента. Однако, поскольку queue: List<Node>() является общедоступным, вы можете просто скопировать функцию get() в свое собственное расширение, и тогда вы сможете делать то, что вам нужно.

+0

Спасибо, но я стараюсь избегать повторения этого аргумента каждый раз, когда я использую этот тег, и поскольку у меня уже есть контекст в методе 'run', я надеялся, что сможет извлечь путь оттуда. – MacAvon

+0

См. Обновление с обходным решением – tobygriffin

+0

Спасибо, что нашли это. Похоже, это странное решение, когда они передают контекст, чтобы «запустить», но я не знаю почему. Предлагаемое обходное решение делает трюк для меня. – MacAvon

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

  • Нет связанных вопросов^_^