2013-06-05 2 views
7

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

У меня есть маршрут/маршрут /: param, где параметр иногда определяется, а иногда нет. Я пытаюсь использовать «param» в шаблоне для этого маршрута, но я получаю сообщение об ошибке «param» требует явного имени пакета. Я знаю, что это связано с тем, что параметр не соответствует маршруту, потому что когда я звоню/трассирую/ценю, все работает нормально.

Есть ли способ использовать один и тот же шаблон для обоих, когда «param» определен и не определен? Я просто пытаюсь предварительно заполнить форму из того, что определено в параметре, но не требует этого.

В шаблоне у меня есть

<% if(defined($param)){ %><%= $param %><% } %> 

Спасибо.

+3

Другой вариант - использовать '$ app-> defaults (param => undef)', чтобы гарантировать, что '$ param' существует для использования в вашем шаблоне. Похоже, как и пред-объявление ваших переменных. – DavidO

ответ

14

Это всегда безопасно, чтобы обратиться к stash("param"), где stash является вспомогательная функция определена в Mojolicious::Plugin::DefaultHelpers:

<%= stash "param" %> 
<%= defined(stash("param")) && stash("param") %> 
etc. 
+0

Это исправлено. Большое спасибо за Вашу помощь. –

1

можно определить переменную stash (или flash) в качестве Perl переменной в пределах EPL space/template, чтобы его можно было повторно использовать, если это необходимо. например,

% if (my $param = stash 'param') {         
    $param 
% } 

В этом случае, если условие блок будет оказан только тогда, когда пары определяются в stash, в противном случае, он будет пропущен.

1

Похоже, что в этой ситуации использование optional placeholder в маршруте может быть лучшим вариантом. Если местозаполнитель определен в самом маршруте, это определение будет использоваться, если местозаполнитель не указан в URL-адресе (иначе используется значение, указанное в URL-адресе).

Например:

$r->any('/page/:paramVar')->to('page#doTheThing', paramVar => 'cake'); 

Если адрес "/ страница" загружается затем $self->param('paramVar') == 'cake' еще, если "/ страница/дерево" загружается затем $self->param('paramVar') == 'tree'.

Примечание. Как и в случае с другими значениями заполнителя, дополнительный объект-заполнитель, такой как paramVar, используемый в приведенном выше примере, может быть доступен через функцию stash, а также функцию param: $self->stash('paramVar').