2013-06-05 9 views
7

Nadal uczę się struktur mojologicznych i MVC w ogóle, więc może to być problem, gdy myślę o tym źle, więc jeśli jestem, sugeruję lepszy sposób na wykonanie następujących czynności.mojoliczne odniesienie do zmiennej ukrytej nie zawsze zdefiniowanej

Mam trasę/trasę /: param, gdzie czasami definiuje się param, a czasami nie. Próbuję użyć "param" w szablonie dla tej trasy, ale pojawia się komunikat "param" wymaga jawnej nazwy pakietu. Wiem, że wynika to z tego, że: param nie pasuje do trasy, ponieważ kiedy wykonuję połączenie/trasę/wartość, wszystko działa dobrze.

Czy istnieje sposób na wykorzystanie tego samego szablonu dla obu, gdy "parametr" jest zdefiniowany i nie jest zdefiniowany? Po prostu próbuję wstępnie wypełnić formularz z tego, co jest zdefiniowane w "param", ale nie wymaga tego.

W szablonie mam

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

Dzięki.

+3

Inną opcją jest użycie '$ app-> defaults (param => undef)', aby upewnić się, że '$ param' istnieje w twoim szablonie. Wygląda na to, że tak jak wcześniej deklarujesz swoje zmienne. – DavidO

Odpowiedz

14

Jest zawsze bezpieczne w odniesieniu do stash("param"), gdzie stash jest funkcją pomocnik zdefiniowane w Mojolicious::Plugin::DefaultHelpers:

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

To naprawiło to. Dziękuję bardzo za Twoją pomoc. –

1

Możliwe jest zdefiniowanie zmiennej stash (lub flash) jako Perl zmiennej w EPL przestrzeń/szablon, aby w razie potrzeby można go było ponownie wykorzystać. np

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

W tym przypadku, jeżeli stan blok będą realizowane tylko wtedy, gdy param zdefiniowano w stash, w przeciwnym razie będzie ona zostać pominięta.

1

Wygląda na to, że w tej sytuacji najlepszym rozwiązaniem może być użycie na trasie optional placeholder. Jeśli symbol zastępczy jest zdefiniowany na samej trasie, ta definicja zostanie użyta, jeśli symbol zastępczy nie zostanie podany w adresie URL (w przeciwnym razie używana jest wartość podana w adresie URL).

Na przykład:

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

Jeśli adres "/ strona" jest ładowany następnie $self->param('paramVar') == 'cake' else if "/ page/drzewo" jest ładowany następnie $self->param('paramVar') == 'tree'.

Uwaga: Podobnie jak w przypadku innych wartości symboli zastępczych do opcjonalnego symbolu zastępczego, takiego jak parametr paramVar użyty w powyższym przykładzie, można uzyskać dostęp za pomocą funkcji ukrywania, a także funkcji param: $self->stash('paramVar').

Powiązane problemy