Rails Controller 入門。アクションとは?ビューへのデータの受け渡し。リクエストデータの取得

今回はRailsのコントローラに関する記事です。

モデルのCRUDに関してはこちらにまとめてあります。

Ruby On RailsでCRUDを学ぶ。

 

コントローラの役割について

Railsを始めるとモデル、コントローラやビューと言ったいわゆるMVCアーキテクチャがよく出て来ますが今回はコントローラについて解説してきます。

MVCアーキテクチャって何??という人はこちら

Rails,Laravelを使う前に知っておきたいMVCアーキテクチャ

MVCアーキテクチャにおけるコントローラの責務はクライアント(ユーザー)からリクエストを受けて、そのリクエストを元に実行するビジネスロジックや返却するビューを決めるといったものになります。

一般的に良くある処理としては

  1. モデルの作成、更新、削除、参照を行う。
  2. 1.の結果をもとにレスポンスを返却する。

になります。

コントローラでの処理もモデルと同じように色々とあるのですが、その中でも今回はビューへのデータの渡し方やアクションの定義について解説していきたいと思います。

 

コントローラの自動生成

 

コントローラの説明の前にRailsでは、scaffoldやジェネレータが充実しているので、Railsでコントローラを作る場合はコマンドから コントローラを作れることをしっておくと便利です。(モデルなども同様です。)

$rails generate controller Hoge index show create
Running via Spring preloader in process 70359
      create  app/controllers/hoge_controller.rb
      invoke  erb
      create    app/views/hoge
      invoke  rspec
      create    spec/controllers/hoge_controller_spec.rb
      invoke  helper
      create    app/helpers/hoge_helper.rb
      invoke    rspec
      create      spec/helpers/hoge_helper_spec.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/hoge.coffee
      invoke    scss
      create      app/assets/stylesheets/hoge.scss

このようなコマンドでコントローラを自動生成できます。

rails generate controller [コントローラ名] [アクション1] [アクション2]...

コマンドの内訳はこのようになっていて、コントローラ名をキャメルケース、スネークケースで入力しそれ以降の引数にアクションをあたえて あげると引数に与えたアクションも同時に作成してくれます。またはgenerateという部分は省略が可能で

rails g controller [コントローラ名] [アクション1] [アクション2]...

という書き方も可能です。

 

コントローラのアクション

 

先にソースを紹介しますが、こちらがコントローラのソースの例になります。

class BlogsController < ApplicationController
  before_action :set_blog, only: [:show, :edit, :update, :destroy]

  # GET /blogs
  # GET /blogs.json
  def index
    @blogs = Blog.all
  end

  # GET /blogs/1
  # GET /blogs/1.json
  def show
  end

  (略)

それぞれの行を説明すると、まず先頭行にかかれている部分がコントローラのクラス宣言になり、コントローラ名というとコントローラのクラス名からControllerという文字を 抜いたものになります。

次にbeforeactionという宣言は、これを宣言しておくことで各アクションに入る前に任意の処理を実行することができます。この場合はshow,edit,update,destroyアクションの前にsetblogというメソッドを実行するようになっています。(実際のメソッドは省略しています。)

次に、defという形で宣言されているのがアクションになり、このアクション一つ一つがそれぞれのルーティングに紐づけられてユーザからのリクエストに対して特定のアクションを実行していきます。(このソース上では、indexとshowアクションが定義されています。)

またルーティングを定義して、rake routesなどでルーティングの確認を行うとblogs#indexという表示がされますが、これはBlogsControllerのindexメソッドにそのルーティングが紐づけられているということを表します。

URLごとの処理を決める。Railsルーティング入門

 

リクエストパラメータを取得する

 

先ほど、コントローラの責務はクライアント(ユーザー)からリクエストを受けて、そのリクエストを元に実行するビジネスロジックや返却するビューを決める。

と書きましたが、コントローラでのリクエストパラメータの取得は以下のように、paramsを使用して取得します。paramsはハッシュのような形で扱えるので

def show
  blog_id = params[:id]
  @blog = Blog.find(blog_id)
end

というような形でリクエストに含まれるデータを取得することができ、これはPOST,GET,PUTなどなどHTTPのメソッド問はず 同じ方法で取得できます。

routingが

blogs/:id

のようになっている場合は、params[:id]でurlから値を取得できますし、

blogs?hoge=fuga

の場合はparams[:hoge]でクエリパラメータの値を取得することができます。POSTなどのフォーム送信でもhtmlのname属性を元にデータを取得 することもできます。

 

ビューにデータを渡す

Railsでコントローラからビューにデータを渡す場合は、インスタンス変数を利用してビューにデータを渡します。 先ほどの例だと ``` def index @blogs = Blog.all end ``` このように@blogsにBlogモデルから取得したデータを格納しています。

ビュー側では、 下記の例のように@blogsというinstance変数でコントローラから渡ってきた値にアクセスすることができます。

app/views/blogs/index.html.erb

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Content</th>
      <th>Category</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @blogs.each do |blog| %>
      <tr>
        <td><%= blog.title %></td>
        <td><%= blog.content %></td>
        <td><%= blog.category_id %></td>
        <td><%= link_to 'Show', blog %></td>
        <td><%= link_to 'Edit', edit_blog_path(blog) %></td>
        <td><%= link_to 'Destroy', blog, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

 

まとめ

まとめです。
  • Controllerの責務は使用するモデル、ビューを決めること
  • Controllerはジェネレータを利用して作成する。
  • アクションはControllerクラスのメソッドで、それぞれがルーティングにひもづけられる。
  • リクエストデータの取得はparamsを通して行う
  • ビューへのデータの受け渡しはインスタンス変数を介して行う。
コントローラはこれいがいにもいろいろと覚えることありますが、今回は一旦ここまでとします。 基本的なところはここでまとめられたかと思うので、次回以降はbefore_actionなどなどまだ解説していない 機能について書いていきます。