Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?
@otaka

Mojolicious+jQueryで、getJSONでハマった

More than 5 years have passed since last update.

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, '"') );

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

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

4
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
otaka
なんでも詰め込み系のWeb屋です。 なので、スキルが薄いです。 極力、ネットで情報が見つからなかったような内容を書いていきたいと思います。 レベルの低い内容ですが、備忘録兼用で投稿します。どなたかのためになればうれしいです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
4
Help us understand the problem. What is going on with this article?