Простые и двойные кавычки в теге шаблона playframework (1.2.4) - PullRequest
2 голосов
/ 06 марта 2012

Если я использую тег URL с двойными кавычками:

@{"/public/images/blue.png"}

Я получаю эту ошибку:

No route able to invoke action CONTROLLERNAME./public/images/blue.png was found

Пока все работает при использовании одинарных кавычек:

@{'/public/images/blue.png'}

Может быть, я слишком много думал о коде и что-то глупое я не вижу?

В документации тега шаблона , в частности в документации @ тега шаблона , я не смог найти упоминания о различном семантическом значении одинарных и двойных кавычек. .

В кавычках двойные кавычки templetable strings, но, тем не менее, это, похоже, не объясняет, почему оно терпит неудачу, и если это известное поведение, оно должно быть написано очень громко в документе - мне потребовалось довольно много много времени, чтобы понять, в чем проблема!

Ответы [ 2 ]

1 голос
/ 07 марта 2012

play.templates.GroovyTemplateCompiler имеет следующий метод для выполнения @{..} и @@{..}:

@Override
void action(boolean absolute) {
    String action = parser.getToken().trim();
    if (action.trim().matches("^'.*'$")) {
        if (absolute) {
            print("\tout.print(__reverseWithCheck_absolute_true("+action+"));");
        } else {
            print("\tout.print(__reverseWithCheck_absolute_false("+action+"));");
        }
    } else {
        if (!action.endsWith(")")) {
            action = action + "()";
        }
        if (absolute) {
            print("\tout.print(actionBridge._abs()." + action + ");");
        } else {
            print("\tout.print(actionBridge." + action + ");");
        }
    }
    markLine(parser.getLine());
    println();
}

Строка action здесь находится между @{ и }. И он вызывается с absolute, установленным в false, если вы используете @{..}. __reverseWithCheck_absolute_true/false - это методы, необходимые для поиска шаблонов. Но если действие не соответствует регулярному выражению "^'.*'$" (что происходит, когда вы используете что-то еще, кроме одиночных кавычек), то оно пытается вызвать action как метод вашего контроллера.

Я не совсем понимаю ту часть, в которой он пытается найти действие Controller, но я верю, что именно это выдает ошибку. actionBridge является экземпляром класса ActionBridge, определенного в play.templates.GroovyTemplate, если вы хотите взглянуть на него ...

0 голосов
/ 07 марта 2012

Как я знаю, вы не можете поместить строку полного пути между @{}, поэтому она не должна работать вообще. Вы должны просто вставить "/public/images/blue.png" в ваш код.

@{} используется для обратной маршрутизации URL данного контроллера и действия.

И если вы действительно хотите проверить, существует ли файл, у вас может быть свой собственный тег.

для тега #{script /}, вот как выполняется проверка "файл существует":

рамки / шаблоны / теги / script.tag

%{
    (_arg ) && (_src = _arg);

    if (!_src) {
        throw new play.exceptions.TagInternalException("src attribute cannot be empty for script tag");
    }
    _src = "/public/javascripts/" + _src
    try {
        _abs = play.mvc.Router.reverseWithCheck(_src, play.Play.getVirtualFile(_src), false);
    } catch (Exception ex) {
        throw new play.exceptions.TagInternalException("File not found: " + _src);
    }
}%
<script type="text/javascript" language="javascript"#{if _id} id="${_id}"#{/if}#{if _charset} charset="${_charset}"#{/if}  src="${_abs}"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...