Rails Controller 入門。アクションとは?ビューへのデータの受け渡し。リクエストデータの取得
今回はRailsのコントローラに関する記事です。
モデルのCRUDに関してはこちらにまとめてあります。
コントローラの役割について
Railsを始めるとモデル、コントローラやビューと言ったいわゆるMVCアーキテクチャがよく出て来ますが今回はコントローラについて解説してきます。MVCアーキテクチャって何??という人はこちら
MVCアーキテクチャにおけるコントローラの責務はクライアント(ユーザー)からリクエストを受けて、そのリクエストを元に実行するビジネスロジックや返却するビューを決めるといったものになります。
一般的に良くある処理としては
- モデルの作成、更新、削除、参照を行う。
- 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メソッドにそのルーティングが紐づけられているということを表します。
リクエストパラメータを取得する
先ほど、コントローラの責務はクライアント(ユーザー)からリクエストを受けて、そのリクエストを元に実行するビジネスロジックや返却するビューを決める。
と書きましたが、コントローラでのリクエストパラメータの取得は以下のように、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を通して行う
- ビューへのデータの受け渡しはインスタンス変数を介して行う。