LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-04

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0