2013-06-05 9 views
7

Sto ancora imparando i framework mojolicious e MVC in generale, quindi questo potrebbe essere un problema in cui sto pensando a questo torto, quindi, se sono per favore, suggerire un modo migliore di fare quanto segue.mojolicious che fa riferimento a una variabile stash non sempre definita

Ho un percorso/percorso /: param dove param viene talvolta definito e talvolta no. Sto cercando di utilizzare "param" nel modello per quella rotta, ma ricevo un errore che dice che "param" richiede un nome esplicito del pacchetto. So che questo è dovuto a: param non corrispondente nel percorso perché quando faccio call/route/value tutto funziona bene.

C'è un modo per essere in grado di utilizzare lo stesso modello per entrambi quando "param" è definito e non definito? Sto solo cercando di precompilare un modulo da ciò che è definito in "param" ma non rendendolo necessario.

Nel modello devo

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

Grazie.

+3

Un'altra opzione è usare '$ app-> defaults (param => undef)' per assicurare che '$ param' esista per l'uso nel modello. Assomigliano a come pre-dichiarare le tue variabili, suppongo. – DavidO

risposta

14

È sempre sicuro per riferirsi a stash("param"), dove stash è una funzione di supporto definita in Mojolicious::Plugin::DefaultHelpers:

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

Che risolto. Grazie mille per il vostro aiuto. –

1

È possibile definire una variabile stash (o un flash) come variabile Perl all'interno EPL spazio/modello in modo che possa essere riutilizzato, se necessario. per esempio,

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

In questo caso il blocco if condizione verrà resa solo quando il parametro è definito nella stash, altrimenti, sarà ignorato.

1

Sembra che in questa situazione utilizzare un optional placeholder nel percorso potrebbe essere l'opzione migliore. Se il segnaposto è definito nella stessa route, tale definizione verrà utilizzata se il segnaposto non viene fornito nell'url (altrimenti viene utilizzato il valore specificato nell'URL).

Ad esempio:

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

Se l'indirizzo "/ pagina" viene caricata quindi $self->param('paramVar') == 'cake' else if "/ page/albero" è caricato poi $self->param('paramVar') == 'tree'.

Nota: Come per altri valori segnaposto, è possibile accedere a un segnaposto facoltativo, come paramVar utilizzato nell'esempio precedente, tramite la funzione stash e la funzione param: $self->stash('paramVar').

Problemi correlati