2013-06-05 18 views
7

我仍然在學習mojolicious和MVC框架,所以這可能只是一個問題,我正在考慮這個錯誤,所以如果我請建議一個更好的方法來做到以下幾點。mojolicious引用一個隱藏變量不總是定義

我有一個路線/路線/:參數其中參數有時被定義,有時不。我試圖在該路線的模板中使用「param」,但我得到一個錯誤,說「param」需要明確的軟件包名稱。我知道這是由於:param在路由中不匹配,因爲當我調用/路由/值時,一切正常。

當「參數」被定義和未定義時,是否有一種方法可以爲兩者使用相同的模板?我只是試圖預先填充「參數」中定義的表格,但並未要求這樣做。

在模板我

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

感謝。

+3

另一種選擇是使用'$ app-> defaults(param => undef)'來確保'$ param'存在用於模板。有點像預先聲明你的變量,我想。 – DavidO

回答

14

總是安全指stash("param"),其中stashMojolicious::Plugin::DefaultHelpers定義一個輔助函數:

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

修復它。非常感謝你的幫助。 –

1

它可以定義一個stash(或flash)變量作爲EPL內的Perl可變空間/模板,以便可以重複使用,如果需要的話。例如,

% if (my $param = stash 'param') {         
    $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'

注意:與其他佔位符值一樣,可以通過存儲函數以及參數函數$self->stash('paramVar')訪問可選佔位符(例如上例中使用的paramVar)。

相關問題