Mojoliciousで吐き出したJSONを$.getJSONが受け取ってくれないんです
いま、Webアプリの管理画面を作成してます。
細かい項目選択で、ドリルダウンをしたかったのですが。
内容は、単純な日付の選択です。年/月を選ぶと日が出てくるという簡単な部分。
単純に引数受け取ったPerl側が対応する月末日をJSONで返す、という感じです。
各ファイルの内容
package MyApp::Admin::Common;
use Mojo::Base 'Mojolicious::Controller';
use strict;
use warnings;
use utf8;
use Encode;
use Time::Piece;
use JSON::XS;
sub month_day{
my $self = shift;
my $print_json;
#self->param('date')に、'2013-12'のような文字列が入っています。
if( $self->param('date') ){
my $get_time = Time::Piece->strptime( $self->param('date'). '-1 00:00:01', '%Y-%m-%d %H:%M:%S' );
$print_json = {
'lastday' => $get_time->month_last_day
};
}
else{
$print_json = {
'status' => 'error', 'err' => '引数が間違っています'
};
}
$self->render( printjson => decode_utf8(JSON::XS->new->utf8->encode($print_json)) );
}
1;
<%= $printjson %>
$.getJSON("/Admin/common/month_day", { date: '2013-12' }, function(data, status) {
alert( data.lastday );
});
と、シンプルな感じです。
で、いくらやっても、$.getJSON
がデータをとってこないのです。
ブラウザで確認したら画面は表示されるし、$.getJSON
からのリクエストがサーバで受け取れてることもターミナルにデータをダンプしてみたりして、で確認できました。
2~3時間悩みました。まさにハマったという感じです。
いま思えば、単純に気づきが足りなかったんです。。。
jQuery
の$.getJSON
が廃止要素なんじゃないか、なんて考えたりしました。ずいぶんと視点がずれていますね。。。
で、結論
ふと気づきました。
<%== $printjson %>
これで解決でした。。。
よく見てみてください。<%=
の=
がひとつ増えました。
単純なことなのですが、<%=
は変数をエスケープして出力、<%==
は変数をそのまま出力、という違いです。
1週間ほど前にTitanium側でJSONを受け取った際にはすぐに気づいて、
var this_response = JSON.parse( response );
を、
var this_response = JSON.parse( String(response).replace(/"/g, '"') );
なんてして回避しました。
(この時は、<%=
と<%==
の違いは分からず、単純にエスケープされて出力されるんだな、とだけ思っていました)
つまらないことで時間を使ってしまった、それはとても寒い冬の日のことでした。