2015年10月29日木曜日

Deviseとomniauth-facebookでFacebook認証したときに元いたページに戻りたい

Deviseとomniauth-facebookでFacebook認証でのログインを実装してたのですが、
元いたページに戻れなかったので、どうやるのか調べました。

修正前
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def after_sign_in_path_for(resource)
    super
  end
end

いろいろ調べてみたところ、ちゃんとセットしているところがあったので、
そこでセットしている request.env['omniauth.origin'] から取得するようにしました。
一応、他サイトに飛ばないように自分のサイトかどうかはチェックしています。
修正後
def after_sign_in_path_for(resource)
  referer = request.env['omniauth.origin']
  if referer.present? && referer.starts_with?(request.protocol + request.host_with_port)
    referer
  else
    super
  end
end


参考URL
https://github.com/intridea/omniauth/issues/306
http://stackoverflow.com/questions/11355928/devise-redirect-to-previous-page-after-authenticating-user-request-referer-re
https://github.com/intridea/omniauth/blob/master/lib/omniauth/strategy.rb#L213
http://blog.yasuoza.com/2012/08/16/devise-omniauth-facebook/

2015年10月23日金曜日

IE10/11でjqueryのajaxで正しくフォームが送れない

jqueryのajaxを使ってformのsubmitを使っていたら、
エラーが出るユーザーがいるとのことだったので、調べたところ
Internet Explorer10/11を使っているときのバグだったようです。

formはこんな感じで組んでいました。
<form accept-charset="UTF-8" action="/test" method="post">
<input class="datepicker form-control" id="test" name="test[dates_attributes][201510000][date]" placeholder="日付を選択してください" readonly="readonly" type="text" value="2015-10-23" />
<input id="dates_attributes_201510007__destroy" name="test[dates_attributes][201510000][_destroy]" type="checkbox" value="1" />
<a class="save-dates-btn">更新</a>
</form>

ajax部分もよくある形で組んでいました。
      $(document).on("click", '.save-dates-btn', function(event) {
        var form = $(this).parents('form:first');
        var formData = new FormData( form[0] );
        $.ajax({
          type: "POST",
          url: "#{update_dates_path}.json",
          data: formData,
          processData: false,
          contentType: false,
          error: function(data){
            console.log("error");
          },
          success: function (data) {
            console.log("success");
          }
        });
      });

サーバーはrailsを使っていて、以下のエラーが出ていました。
!! Unexpected error while processing request: bad content body

調べていったところ、
IE10/11ではformの中の最後のinputがチェックボックスで、それに対してチェックボックスがついてないときに、
ajaxで送るformDataの値がおかしくなるようです。

対策としてはcheckboxが最後にならないようにすればよいようで、
最後にhiddenでもよいのでダミーのパラメータを追加して対応しました。
<input name="dummy" type="hidden" value="1" />


参考URL
https://blog.yorkxin.org/posts/2014/02/06/ajax-with-formdata-is-broken-on-ie10-ie11/

2015年10月1日木曜日

JAWS-UG Meguro #2に参加してきました

先週の話ですが、JAWS-UG Meguro #2に参加してきました。
http://jawsug-meguro.connpass.com/event/18162/

正直、今の会社ではまだ使わないような技術の話ばっかりだったのですが、
今後のためにとてもためになったと思います。

特にmyfinderさんの「今更聞けないストリーム処理のあれとかこれ」の話は、
これからどう入れていこうかなってステージの自分にはすごくためになりました。
発表の資料は↑のイベントページにアップされているので、そちらを見ていただくのがよいです、
要約すると、stream処理ってものはどういうもので、
それを処理するための基盤と技術の選択肢はこういうのがあるよっていうのを、
パターンを提示してくれている発表でした。
実際にどうやってみるかは結局手を動かしてみないとわかんないと思うので、
まずどういうのを試してみるのがいいかってのが判断できるだけでも、
この発表が自分にとってはすごくためになりました。