Help us understand the problem. What is going on with this article?

RailsでAjaxを使う場合にredirect_to modelではなく@modelにする理由

More than 1 year has passed since last update.

Postの操作を画面遷移からAjax操作に書き換える

Railsチュートリアル14章で、Ajax操作を実装したために上のコードを下のコードへと書き換える下りがある。

app/controllers/relationships_controller.rb
   redirect_to user

app/controllers/relationships_controller.rb
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end

これは、Twitterのようなアプリを作成するとして特定のユーザーをフォローした後に、そのユーザーの画面を再表示するためにリダイレクトする処理となる。

Railsチュートリアルでの説明

下のコードを実装したために、インスタンス変数が必要になるというのが理由と書かれているが、いまひとつ腑に落ちないのではないか

app/views/users/_follow.html.erb
<%= 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はその実装前から使われているではないか

app/views/users/_follow.html.erb
<%= 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メソッドは

app/controllers/relationships_controller.rb
  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を登録処理内部で設定する必要が生じる

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