1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsにおけるリクエストからレスポンスの流れ

Posted at

#はじめに
 Webページを表示したり、タスクの新規作成をする際にrailsのなかでどのような処理が行われているのかをまとめました。

ユーザーの一覧ページを表示する(GETメソッド)

  • /usersというパスに対してGETリクエストがWebサーバに送られる。

    (POSTではなくGETを使う理由は、一覧表示ではデータの書き換えは必要ではなく、データを取得したいだけなのでGETを使う)
  • WebサーバがGETリクエストを受け取りroutes.rbresources :usersにより、それに対応するコントローラのアクションが呼び出される。
  • コントローラのindexアクションで全ユーザーのデータを取得する。
def index
  @users = User.all
end

(この記述だけでデータベースからデータを取得できる理由は、RailsにはモデルにActiveRecordが継承されているので、Rubyを用いてデータベースからデータを探したり、持ってくることができる。)

  • indexアクションに紐づくindex.html.erbを編集する

@users.eachでuserオブジェクトを一つずつ取り出し、その情報がHTMLタグの中に動的に埋め込まれ、HTMLを組み立てる。

<% @users.each do |user| %>
    <li>
      <%= user.name, user %>
    </li>
  <% end %>

(データベースに検索されるタイミングはindexアクションでUser.allされたときではなく、検索結果が必要なタイミングで行われるので、今回の場合は@users.eachが呼ばれた時)

  • Webサーバからindex.html.erbで組み立てたHTMLをHTTPのレスポンスボディにのせてレスポンスを返す。
  • Webブラウザがレスポンスを受け取り、処理して画面にユーザー一覧が表示される。

タスクを新規作成する(POSTメソッド)

新規作成ページを表示する

  • /tasks/newというパスに対してGETリクエストがWebサーバに送られる。
  • WebサーバがGETリクエストを受け取りroutes.rbresources :tasksにより、それに対応するコントローラのアクションが呼び出される。
  • コントローラのnewアクションで新しいオブジェクトを作成
def new
  @task = Task.new
end

タスク名(name)を入力する

  • 入力フォームのHTMLを生成するためnewアクションに紐づくnew.heml.slimを編集する。
= form_with model: @task, local: true do |f|
 .form-group
   = f.label :name
   = f.text_field :name, class: 'form-cotrol'
 = f.submit nil, class: 'btn btn-primary'
  • form_withによってこのようなHTMLが生成される。
<form action="/tasks" accept-charset="UTF-8" method="post">
     <input name="utf8" type="hidden" value="✓">
     <input type="hidden"name="authenticity_token"value="0/MwK3LxN24WXfQNV5cFYZkbRSoRsL9QEomdh2h+Hr2BpWQqeW95LO7MM4ZZGoz56y+mHx0hMETSwAW18fqKvw==">
       <div class="form-group">
            <label for="task_name">Name</label>
              <input class="form-cotrol" type="text" name="task[name]" id="task_name">
         </div>
         <input type="submit" name="commit" value="登録" class="btn btn-primary" data-disable-with="登録"></form>

作成ボタンを押す

  • form_withで生成されるmethod: postによって、フォーム内容を送信するときにPOSTメソッド指定される。/tasksに対してPOSTリクエストが送られるとroutes.rbresources :tasksで対応するtasks_controllerのcreateアクションが実行される。
  • task_paramsで取得したデータをTask.newの引数にしてインスタンスを作成
 def create
    @task = Task.new(task_params)
    if @task.save
      redirect_to @task
    else
      render :new
    end
 end
 
 private
 
 def task_params
   # require(:task)は生成されたHTMLのname="task[name]"のtaskと関連している。
   # permit(:name)で指定したカラムのみ取得する。
   # リクエストボディの「入力されたタスク名」がRailsによりparamsオブジェクトの中にハッシュのような構造で入る
   params.require(:task).permit(:name)
 end

タスク詳細ページに遷移する

  • データベースへの保存が成功した場合、リダイレクト先を@taskとすることで詳細ページに遷移する(redirect_to @taskはredirect_to task_url(task.id)と同じ意味を持つ)
1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?