2013-06-05 3 views
7

Ich lerne immer noch mojolicious und MVC-Frameworks im Allgemeinen, so dass dies ein Problem sein könnte, wo ich über das falsch denke, also wenn ich bitte vorschlagen einen besseren Weg, das folgende zu tun.mojolicious Verweisen auf eine Stash-Variable nicht immer definiert

Ich habe eine Route/Route /: Param wo Param manchmal definiert ist und manchmal nicht. Ich versuche, "param" in der Vorlage für diese Route zu verwenden, aber ich bekomme einen Fehler, der sagt, dass "param" expliziten Paketnamen erfordert. Ich weiß, das liegt daran: Param nicht in der Route übereinstimmen, denn wenn ich Call/Route/Wert alles funktioniert gut.

Gibt es eine Möglichkeit, dieselbe Vorlage für beide zu verwenden, wenn "param" definiert und nicht definiert ist? Ich versuche nur, eine Form von dem, was in "param" definiert ist, vorzubelegen, aber ich mache es nicht erforderlich.

In der Vorlage Ich habe

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

Dank.

+3

Eine weitere Option ist die Verwendung von '$ app-> defaults (param => undef)', um sicherzustellen, dass '$ param' für die Verwendung in Ihrer Vorlage existiert. So wie ich deine Variablen vorausdeklariere. – DavidO

Antwort

14

Es ist immer sicher stash("param") Bezug zu nehmen, wo stash eine Helferfunktion in Mojolicious::Plugin::DefaultHelpers definiert ist:

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

Das hat es behoben. Vielen Dank für deine Hilfe. –

1

Es ist möglich, einen stash (oder ein flash) Variable als Perl Variable innerhalb des EPL zu definieren, Space/Template, damit es bei Bedarf wiederverwendet werden kann. z.B.

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

In diesem Fall ist der, wenn die Bedingung Block wird nur gemacht werden, wenn der param im stash definiert ist, andernfalls wird es übersprungen werden.

1

Es scheint, als wäre in dieser Situation die Verwendung einer optional placeholder in der Route die beste Option. Wenn der Platzhalter in der Route selbst definiert ist, wird diese Definition verwendet, wenn der Platzhalter nicht in der URL angegeben ist (andernfalls wird der in der URL angegebene Wert verwendet).

Zum Beispiel:

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

Wenn die die Adresse "/ Seite" geladen wird dann $self->param('paramVar') == 'cake' else if "/ page/Baum" geladen wird dann $self->param('paramVar') == 'tree'.

Hinweis: Wie bei anderen Platzhalterwerten kann auf einen optionalen Platzhalter wie paramVar, der im obigen Beispiel verwendet wird, über die Funktion stash sowie die Parameterfunktion zugegriffen werden: $self->stash('paramVar').

Verwandte Themen