Postの操作を画面遷移からAjax操作に書き換える
Railsチュートリアル14章で、Ajax操作を実装したために上のコードを下のコードへと書き換える下りがある。
redirect_to user
respond_to do |format|
format.html { redirect_to @user }
format.js
end
これは、Twitterのようなアプリを作成するとして特定のユーザーをフォローした後に、そのユーザーの画面を再表示するためにリダイレクトする処理となる。
Railsチュートリアルでの説明
下のコードを実装したために、インスタンス変数が必要になるというのが理由と書かれているが、いまひとつ腑に落ちないのではないか
<%= form_for(current_user.active_relationships.build, remote: true) do |f| %>
<div><%= hidden_field_tag :followed_id, @user.id %></div>
<%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>
なぜならば、インスタンス変数が必要となる実装前のコードが以下のコードである。
「remote: true」が差分で、@userはその実装前から使われているではないか
<%= form_for(current_user.active_relationships.build) do |f| %>
<div><%= hidden_field_tag :followed_id, @user.id %></div>
<%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>
Ajax通信でPostした場合と、通常の通信でPostした場合の差
Ajax通信は非同期通信である。
非同期通信がやっていることは、画面を遷移せずに裏でこっそりサーバー側に通信を送っていることとなる。
裏を返すと、非同期通信をしない場合は画面を遷移していることになる。
先ほどの画面の例だと
元々の
「クライアントが フォローボタンを押す→
サーバーが DB上でフォローする→userのモデルに対応する画面のページに遷移する」
処理が
「クライアントが フォローボタンを押す→
サーバーが DB上でフォローする→@userのモデルを画面に返してあげる」
処理に差し変わったということである
元の処理では画面遷移する=画面を0から組み立てるのでcontrollerのshowメソッドを経由する。
このshowメソッドは
def show
@user = User.find(params[:id])
@microposts = @user.microposts.paginate(page: params[:page])
redirect_to root_url and return unless @user.activated
end
というコードであり、こちらで@userを設定しているため
登録処理では@userを設定する必要がない
一方、Ajax処理を行うコードでは、リダイレクトでそのまま画面に戻っていくため
@userを登録処理内部で設定する必要が生じる