てくのろーぐ

新卒エンジニアの日常ログ

Ajaxのsuccessとerrorオプション

ajax処理のsuccessブロックやerrorブロック内で値を更新してもブロック外では取得できない。 console.logで表示されるので取れると思ったら出力行が違いましたとも 単純なことだけど1時間位ハマってしまった...

$("div#source_form").click(function(){
 error = [];
  $.ajax({
    url: "sources/set_content",
    type: "GET",
    data: {content : $("div#editor").text()},
    datatype: "html",
    success: function(data){
      error.push(data)
    },
    error: function(data){
    }
  });
    console.log(error) // 表示される
    error[0] //undefined

なんてことを調べてたら

qiita.com

どうやら既に化石化した書き方だったみたいです。 明日...書き直さなきゃ...

simplexml_load_fileにハマった話

昨日書いた記事のような感じでRSS取得作業を行っていたのですが、
業務に必要なページが取得できずハマりました。

まだ解決できていないのですが、調べたことやったことを書きます。

php.iniの確認

allow_url_fopen = on
この項目がoffになっていると取得できません(今回の場合は特定サイトからできないだけなので関係なかった)

$http_response_headerを調べる

$http_response_header =null
$data = file_get_contents('サイト名');
var_dump($http_response_header)

詳細なエラーメッセージが取得できます。
最初にnullを代入しないと成功したときの情報が残っていて表示されてしまうケースが有るみたいです。今回は500 Internal Server Errorでした。

ソースの構造を調べる

取得段階ではなくパースで躓いたならここかも
(取得できてたらsimplexml_load_fileとは関係ないのでは)

$_SERVERを調べる

サーバ情報や実行時の環境情報を取得できるので、解決のヒントが見つかるかも



解決でき次第、原因を追記します
同URLの違うページからは取得できたりするから余計にわからない。

PHPからRSSを取得する

仕事で必要になって調べたのですが、

$rss = simplexml_load_file('http://localhost:8888/tech/feed');
$item = $rss->channel->item;
$title = $item[$counter]->title;
$date = date('Y.m.d', strtotime($item[$counter]->pubDate));
$link = $item->link;
$description  = mb_strimwidth (strip_tags($item[$counter]->description), 0 , 64, "…", "utf-8");

これを回すだけで取得できます。全部取得するならforeachが楽ですね
今回はWordPressですが、XMLならちょっと変えるだけで取れると思います。

調べたこと

$rss = simplexml_load_file('http://localhost:8888/tech/feed

指定したファイルの中の整形式(XML)をオブジェクトに変換してい変数に代入
XMLの構造がそのままオブジェクトになってます

$item = $rss->channel->item;
$title = $item[$counter]->title;
$link = $item->link;

アロー演算子を使ってアクセスして

$description  = mb_strimwidth (strip_tags($item[$counter]->description), 0 , 64, "…", "utf-8");

取得した文字列からstrip_tagsでhtmlタグを除去、mb_strimwidthで文字数の制限や文字コードの指定などをしています。

これ以外にもPHPはやたら便利な関数が多い気がする。

javascriptの値をrailsのController側に渡す

view側のjavascriptの値(textFieldや変数など)をController側に渡すためにしたことのメモです。

Ajax通信をするためのjQuaryを記述
ルーティングを設定
Controller側に処理を記述


Ajax通信をするためのjQuaryを記述

$("div#source_form").click(function(){
  $.ajax({
    url: "sources/set_content",
    type: "GET",
    data: {content : $("div#editor").text()},
    datatype: "html",
    success: function(data){
      //成功時の処理
    },
    error: function(data){
      //失敗時の処理
    }
  });
});

jQuary自体がわからないという方はこちらを参考にすれば分かるかと思います。
http://railsdoc.com/jqueryjQuery - - Railsドキュメント


.ajaxAjax通信をするために必要な記述です。

  • url: 通信先のURLです。基本的にはルーティング設定を行ったあとの
rake routes

で表示されるURLをそのまま入力すれば大丈夫だと思います。

  • type: get or post 通信方式を記述します。
  • data: Controllerに送信したいデータです。複数送信することも出来ます。(ここでは1つです)
  • datatype: サーバから返されるデータ型です。


ルーティングを設定

root.rbに記述します

get"sources/set_content"

rake routesで正しく設定ができたか確認すると良いと思います。



Controller側に処理を記述

  def set_content
    @tmp = params[:content]
    render nothing: true
  end

params[送信データ名]で値を受け取ります。
レンダリングするViewがない場合は上のように記述してください。


終わり