Help us understand the problem. What is going on with this article?

SchooのRuby on Rails入門のまとめ

SchooのRuby on Rails入門の内容をまとめました
動画を見た人の備忘録に使えます!
つまづいたところの解決方法も載せています!

どうも、ITのんびりです
Railsの自社開発企業に入社してもうすぐ2ヶ月です
未経験で入社した同僚の中でぼくだけスクールでRubyやRailsの勉強していませんでした。
だから、仕事中にSchooという動画学習サービスで勉強しました。

Ruby on Rails入門は全部終わったので、その内容をまとめました

記事を読んで興味が出たら、Schooで動画を見てみてください
初心者には動画の方が挫折せずに続きやすいと思います!

前々回の記事:Ruby入門のまとめ
前回の記事:Ruby実践のまとめ

第3回 Railsアプリケーションの新規作成

rails db:create

でデータベースが作られる

SQLの「CREATE DATABASE」が実行される

config/database.ymlの通りにデータベースが作られる

rails db:migrate

でテーブルが作られる

SQLの「CREATE TABLE」が実行される

db/migrate/xxx.rbの通りにテーブルが作られる

rails server

でHTTPサーバを起動する

could not connect to server: No such file or directory
Is the server running locally and accepting connections on Unix domain
socket "/var/run/postgresql/.s.PGSQL.5432"?

rails sをしてlocalhost:3000でこのようにエラーが出たときはpostgresが起動していないので

sudo service postgres start

で起動する

第4回 Railsアプリケーションの処理の流れ(表示編)

cloud9で新しいターミナルを開いた時に

Warning: PATH set to RVM ruby but GEM_HOME and/or GEM_PATH not set, see:
    https://github.com/rvm/rvm/issues/3212

が出たら、railsコマンドが使えなかった

rails sをすると

/home/ec2-user/.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': can't find gem railties (>= 0.a) with executable rails (Gem::GemNotFoundException)

が出たので、

gem install rails
bundle install

をしたらできるようになった

rails db

で入るとSQLが使える

scaffoldを使うとコントローラに

  before_action :set_blog, only: [:show, :edit, :update, :destroy]

と書かれる

意味はshow、editなどのメソッドに限って、アクションを実行する前にset_blogメソッドを実行しなさい

set_blogメソッドはコントローラの下の方にある

new.html.erbの

render 'form'

はviews/blogs/_form.html.erbに書いてある

フォームを作るメソッド

renderを使うとその名前のファイルが呼び出される

第5回 Railsアプリケーションの処理の流れ(登録・更新・削除編)

createボタンの部分のソースコード

<form class="new_blog" id="new_blog" action="/blogs" accept-charset="UTF-8" method="post">

/blogsに対するPOSTメソッドの通信が発生するという意味

scaffoldするとroutes.rbに

resources :blogs

と書いてくれるらしい

一覧画面とか登録画面とかのルーティングを全部よしなに決めてくれる

format.html { redirect_to @blog, notice: 'Blog was successfully created.' }

createメソッドで新しいページを作ったら、リダイレクトで「新しいページを作った」というページを表示させてる

POSTの後にGETを動かしている

editで更新すると、デベロッパーツールを見ると、下のForm Dataのmethodにpatchと表示される

patchは2014年に復活したHTTPメソッドらしい

destroyボタンで削除すると、リクエストメソッドはPOSTで、Form Dataの_methodはdeleteと表示される

第6回 Git経由でHerokuにデプロイ

git initしてから

git config --global user.name "名前"

git config --global user.email "メールアドレス"

名前とメールアドレスに自分のものを入れて、gitユーザとして登録する

第7回 Ruby on Rails の規約基礎

ファイル名は小文字でで区切る。class名は大文字から始めては使わない。

class BlogsControllerがBlogsと複数形にするのは、コントローラに複数のメソッドがあるから

モデルは、Ruby語で話すRailsとSQL語で話すRDBMSを対応させる役割がある

ActiveRecordはRailsをインストールしたときに最初から入ってくる

モデルのファイルはファイル名もクラス名もBlogみたいに単数形にすると、Blogsというテーブルができる

テーブルには複数のデータが入るから複数形。

モデルはその概念を表す唯一の存在。データを保有しているわけではなく、唯一の存在であるから単数形。

モデルはblog_model.rbとかclass BlogModelとかみたいにmodelはつけずに、blog.rb、class Blogとする。

Railsは単数複数を自動で認識してくれるらしい

personというモデルがあったら、peopleというテーブルを探してくれるらしい

だから、ルールから逸脱する名前をつけるとエラーになったりする

モデルのファイルにはbelongsとかhas_manyとかを書く

マイグレーションファイルはカラム名とかデータ型とかを書く

Don't Repeat Yourself (DRY)

レイアウト、テンプレート、パーシャルの3つに分かれている

application.html.erbは全ページ共通部分

<%= yield %>

にテンプレートの部分が入る

各画面に固有のものはテンプレート

各画面で共有できるものはパーシャル

render 'パーシャル'

_パーシャルというファイル名が呼び出される

<%= render 'form', blog: @blog %>

blogに@blogを代入して_form.html.erbだけで使うという意味

ViewはHTMLの素になる。アセットはCSS、JavaScript、画像の素になる。

第8回 環境とアセットパイプライン、Bootstrap

8.1環境

実務では開発環境、テスト環境、本番環境が必要。development、test、production。

Railsは、設定ファイルを分けるだけで複数環境を共存させた状態で開発することができる

config下のファイルはrails sとかrails cとかを実行すると読み込まれた状態で保持される

rails newをするとconfig/environmentにdevelopment.rbとtest.rbとproduction.rbができる

それぞれの環境設定が書かれている

rails sとすると、* Environment: developmentと書いてある。標準で開発環境になっている

rails s -e 環境名
でその環境で動かせる

rails s -e testなど

rails cもrails dbも同じ感じ

rails c -e 環境名
rails db -e 環境名
rails dbだと標準で、develop環境になるので、config/database.ymlの

development:
  <<: *default
  database: achieve_development

databaseにachieve_developmentと書いてあるので、achieve_developmentに入る

rails db:createでその環境のDBを作ってないと

rails db -e production
#=> psql: FATAL:  Peer authentication failed for user "achieve"

というエラーになる

8.2 SASS、Coffee

Sassとは、「Syntactically Awesome Stylesheets」の略称で、「構造的にイケてるスタイルシート」と意味

Webブラウザの表示スピードとエンジニアの開発スピード双方ともに向上させる仕組みとしてアセットパイプラインがある

開発するエンジニアとしてはファイルを分割した方が開発しやすい。ブラウザではファイルを少なくしてインデントを無くした方が表示スピードが上がる。

それを両立させるのがアセットパイプライン。

アセットは、アセットパイプラインという仕組みを経由して、レスポンスとしてWebブラウザから読み込まれる

8.3 マニフェストファイル

マニフェストファイルとは、各種アセットを束ねる役割を持つファイル。

コメントに見える場所も重要な意味を持つ。

app/assets/stylesheets/application.cssに

 *= require_tree .
 *= require_self

という行がある

コメントアウトされているが、application.cssと同じ階層のblogs.scssなどのファイルを読み込み、自分を読み込むという意味

ブログの画面とかいろんなページごとにcssファイルがたくさんできるが、これがあることでviews/layouts/application.html.erbに

<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>

の一行を書くだけでよくなる。普通は100個のCSSがあったら100行書かないといけないらしい。

ブラウザで表示されるときにはソースを見ると一行ずつスタイルシートが書かれて表示されてるっぽい。

コードを書くときは簡単にできて、完成品はちゃんとしたものができるということかな。

application.jsにも

 *= require_tree .

と書いてあるので、同じ階層のblogs.coffeeなどを読み込む。

application.html.erbに

<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

と書いてある。'application'と書くことで、application.jsを呼び出す

8.4 Bootstrap

マニフェストファイルがあれば簡単にCSSやJavaScriptをHTMLに組み込めるが、CSSやJavaScriptのファイルを1つずつ作るのはめんどい。

そこでBootstrapを使う。

BootstrapはCSSフレームワーク。

自分で定義しなくても、独自に定義されたCSS一式をいきなり使うことができる。

BootstrapをRailsに組み込む。BootstrapはCSSフレームワークなのでRailsでもPythonでも使える。

Bootstrapはブラウザサイズを4段階で自動検知。4つのサイズに応じて、利用するCSSを切り分けることができる。

グリッドシステムは、ブラウザのヨコ幅に応じて、表示させる大きさ や配置を変える仕組み。ヨコ幅を12分割して管理

例:画面サイズ「中:Midium」で「等分2カラム」構成

2等分にするときは、1つのカラムで6分割使う

railsでBootstrapを使う手順

Gemfileに

gem 'twitter-bootstrap-rails'

を追加する

bundle install

をする

rails g bootstrap:install static

をする

viewの下のhtml.erbの中身を編集する

layoutsの下のapplication.html.erbの中身も編集する

画像を表示させたいときはapp/images/の下に画像ファイルをおく

stylesheets/の下にclean_blogs.cssみたいなファイルを作って編集する。Bootstrapで使えるフリーのCSSなどを使ってもいい。

BootstrapはRailsとは全然別。名前をいい感じに探してそのファイルだけを読み込むとかはしない。

アセットパイプラインでstylesheetsの下のファイルは全て上から読み込まれるので、cssのbodyが複数のファイルに書かれていたりしたら競合してよくわからない表示になったりする。

heroku config

とすると、RAILS_ENV: production

と表示されるのでproduction環境がデプロイされる

第9回 アソシエーション基礎

blogsとusersのテーブルを分けておけば、ユーザ情報が変更してもユーザのテーブルだけを書き換えればいい

1つのテーブルにブログ情報とユーザ情報を書いてしまうと、テーブルが増えたときに全部のテーブルを書き換えないといけないので大変

分けると簡単

オブジェクト指向のクラスはデータベースのテーブル、メソッドはカラムに1対1で対応させて翻訳している

Rails内部でアソシエーション経由でデータを取得する場合、定義したアソシエーション名をメソッドとして使う

第10回 セッション管理

ブラウザの内部構造。データストレージの中にクッキーがあり、ネットワーキングにより内容が送受信される。

クッキーは、Webブラウザに備わっているWebブラウザとサーバのやりとりの情報を記録保持できるもの。

ドメインごとに4KBのファイルとして管理され保存される

Railsのcookieメソッドが動く

ステートフルを実現する方法は、Webブラウザ側とサーバ側の双方内でどの手法をとるかの組み合わせの数だけ存在する

セッション管理の比較表。Railsではクッキーストアがデフォルトの設定になっている。

キャッシュストアとActiveRecordストアでは、ブラウザにセッション情報を持たせない

銀行系とかセキュリティが大事なところでは、ブラウザにセッション情報を持たせるクッキーストアは使わないらしい

Railsではセッション情報をsecret_key_baseでハッシュ値に変換して暗号化しているらしい

config/secrets.ymlにsecret_key_baseが書いてある

development環境とtest環境のsecret_key_baseはバレても問題ないが、production環境のsecret_key_baseはバレたらいけないので、

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

こんな感じで環境変数に入れてローカルに保存して、ローカルでコマンドを叩かないと見れないようにしてある

session_idなどを暗号化する

_csrf_tokenというのはページごとにランダムなものに変化して、暗号化したセッション情報が変わるようにしている

だから_achieve_sessionはページを切り替えるごとに更新される

リクエストでachieve_sessionを送って_csrf_tokenが変更されて、レスポンスで返ってくるachieve_sessionは違う値になっている

次にページを変えたりするときには、前にレスポンスで返ってきた_achieve_sessionをリクエストで送る

だけど、Amazonではどれが_achieve_sessionに当たるかがわからないけど、session-tokenというのはいつも同じだった。なんでだろう?

ログイン機能をあっという間に実装できてしまうdeviseというgemがある

おわりに

最後まで読んでいただきありがとうございました。
次はRuby on Rails入門の内容をまとめて記事にします!
QiitaやTwitterなどにコメントをしてもらったり、SNSでシェアしてもらえるとうれしいです!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away