ギークなエンジニアを目指す男

機械学習系の知識を蓄えようとするブログ

Railsチュートリアル2章を学んでみた

Railsチュートリアル2章に突入しました。

2章ではToyアプリケーションという、おもちゃアプリケーションを作成しながらRailsの勉強をしていきます。

scaffoldジェネレータとは

Railsにはscaffoldジェネレータというスクリプトが搭載されており、大量の機能を自動的に生成することができるようです。

この機能を用いて、Railsアプリの構造と、Railsで推奨される RESTアーキテクチャ について学ぶ章になっています。

ルーティングについて

過去の記事でもとりあげていますが、今回scaffoldで作成することにより、新規ユーザ登録やユーザ一覧などのページが自動的に追加されます。

railsチュートリアルの2.2.1にある図は、下記コマンドで把握することが可能です。

$ rails routes
   Prefix Verb   URI Pattern               Controller#Action
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
     root GET    /                         application#hello

railsチュートリアル2.3.3の演習1

この演習問題の解答がチュートリアルには載っていない?ため、現時点で私が思いついた解答を載せておきます。
(もし間違っていたら指摘していただけると大変嬉しいです)

ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。同ファイル内の他のコードから文法を推測してみてください (コラム 1.1で紹介した技術の出番です)。うまく表示できたかどうか、/users/1 にアクセスして確認してみましょう。

toy_app/app/controllers/users_controller.rb

~~~
def show
    @micropost = Micropost.find(params[:id]) #追加
end
~~~

toy_app/app/views/users/show.html.erb

~~
<p>
  <strong>Email:</strong>
  <%= @user.email %>
</p>

<!-- 追加開始 -->
<p>
  <strong>最初の投稿:</strong>
  <%= @micropost.content %>
</p>
<!-- 追加終了 -->

<%= link_to 'Edit', edit_user_path(@user) %> |
~~

現時点での疑問点

  • コントローラー(user_controller.rb)のeditメソッドには@user変数が存在しないが、ビュー(edit.html.erb)で@user変数が使用できるのはなぜか。

上記、なんとなく理由がわかりました。 toy_app/app/controllers/users_controller.rb

~~~
before_action :set_user, only: [:show, :edit, :update, :destroy]
~~~
private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.require(:user).permit(:name, :email)
    end
~~~

このbefore_acrionによって、定義されている各アクションの実行前に @user = User.find(params[:id])
が実行されているからのようです。

まとめ

この章ではScaffoldという機能を中心に、Rrailsの構成を理解しようとしてきました。

しかし、Scaffold機能ではコードの中身を理解するのも難しく(現段階では)、これを元にRailsを細部まで理解するのは難しいと感じました。

しかし、1章に比べ、より本格的なアプリケーションを作成できたのは間違いないと思います。

特にデータベースにデータを入れたり、データベースから値を取得したりなど、いかにもWEBアプリっぽくて、楽しかったです。

例のごとく2章のソースコードを置いておきますので、よければ参考になさってください。

github.com