LoginSignup
3
4

More than 5 years have passed since last update.

Mojolicious+jQueryで、getJSONでハマった

Posted at

Mojoliciousで吐き出したJSONを$.getJSONが受け取ってくれないんです

いま、Webアプリの管理画面を作成してます。
細かい項目選択で、ドリルダウンをしたかったのですが。
内容は、単純な日付の選択です。年/月を選ぶと日が出てくるという簡単な部分。

単純に引数受け取ったPerl側が対応する月末日をJSONで返す、という感じです。

各ファイルの内容

lib/MyApp/Admin/Common/
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;
template/my_app/admin/common/month_day.html.ep
<%= $printjson %>
    $.getJSON("/Admin/common/month_day", { date: '2013-12' }, function(data, status) {
        alert( data.lastday );
    });

と、シンプルな感じです。

で、いくらやっても、$.getJSONがデータをとってこないのです。
ブラウザで確認したら画面は表示されるし、$.getJSONからのリクエストがサーバで受け取れてることもターミナルにデータをダンプしてみたりして、で確認できました。

2~3時間悩みました。まさにハマったという感じです。
いま思えば、単純に気づきが足りなかったんです。。。
jQuery$.getJSONが廃止要素なんじゃないか、なんて考えたりしました。ずいぶんと視点がずれていますね。。。

で、結論

ふと気づきました。

template/my_app/admin/common/month_day.html.ep
<%== $printjson %>

これで解決でした。。。
よく見てみてください。<%==がひとつ増えました。

単純なことなのですが、<%=は変数をエスケープして出力、<%==は変数をそのまま出力、という違いです。

1週間ほど前にTitanium側でJSONを受け取った際にはすぐに気づいて、

var this_response = JSON.parse( response );

を、

var this_response = JSON.parse( String(response).replace(/&quot;/g, '"') );

なんてして回避しました。
(この時は、<%=<%==の違いは分からず、単純にエスケープされて出力されるんだな、とだけ思っていました)

つまらないことで時間を使ってしまった、それはとても寒い冬の日のことでした。

3
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4