pig's diary

何でも忘れるので万年初心者ね

【質問終了】ruby on rails3で、rjsを全然使わずにxhrリクエストをさばくapiを作りたいのですが、・・・

リクエストヘッダが違うよの図

質問:

Google Closure × Rails がやりたかったんです。

ruby on rails3で、rjsを全然使わずにxhrリクエストをさばくapiを作りたいのですが、書き方がわかりません。

例えば、postの xhrで、createメソッドをよんでコメントを書き込んだあと、書き込んだコメントをjson形式でrespondして、クライアントサイドで使いたいのですが、controllerの書き方がわかりません。

xhrリクエストに対し、jsonを返すcontrollerの書き方が分かりましたら、教えてもらえますか。

自己解決

comment_controller.rb

  def create
    return redirect_to '/404.html' unless request.xhr? // xhr以外をはじく
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment])
    respond_to do |format|
      format.js { render :text => @comment.to_json } // xhrアクセスの際はjsonをレスポンスする
    end 
  end

JS側。リクエストヘッダにこれを入れる。僕はgoogle closure だからこれ

my.App.prototype.onSubmitComment_ = function(e) {
  e.preventDefault();
  var xhr = new goog.net.XhrIo();
  xhr.headers.set('Accept', 'text/javascript'); // respond_to のformat.js に対応
  xhr.headers.set('X-Requested-With', 'XMLHttpRequest'); // request.xhr? を trueにする
  var query = new my.util.Uri(); // formのデータをrails用にシリアライズする人
  query.setRailsFormQuery(this.form_);
  this.eh_.listen(xhr, goog.net.EventType.COMPLETE,
    this.onCompleteSubmitComment_);
  xhr.send(this.form_.action, 'POST', query.toString());
};

セキュリティ的にはどうなんでしょうね。外部からは叩けないから安全てことなのか。


参考
http://lists.rubyonrails.org/pipermail/rails/2006-June/049297.html