スクリーンショット_2020-02-27_22

Ruby on Rails道場1の振り返り(Progate)


引っかかったところ


✅最初の「rails new (アプリ名)」忘れ ※フォルダ生成
✅次の「rails s」忘れ ※Railsサーバー起動
✅「rails g controller home top」を、スペースでなく「home/top」や「home.top」と書いてしまい✖️
✅aboutを作るとき、home内なのに手動作成せず「rails g」…とやりかけ✖️
✅aboutのルーティングを「/about」としてるのに、ヘッダーからのリンクで「home/about」と書き✖️


編集すべきファイルがどこにあるか覚えていない
違うフォルダにも似た名前のファイルがあり、別ファイルと気付かずに開いて編集してしまい、エラーになる(それでも気付かない)
ex.)  controllerを編集するつもりがmodelsフォルダを開いている、等


✅ビューファイル(html)内のRuby記述、link_toなど<%=   %>で書くべきところを<%  %>で書き、エラーになる。その逆も。
✅「rails g model Post content:text」を「post」や「posts」と書きそうになる
✅「rails console」でコンソールで入る前に「post = Post.new~」✖️

❗️✅コンソールで「post = Post.new("テスト1")」と書き、saveしてもエラーをもらい続け、ずっと止まりました✖️✖️ 
※正しくはPost.new(content: "テスト1")
✅コンソールquit後、「rails db:migrate」をもう一度しないとエラーをもらうことがあった(テーブルの構成を変えてしまってた?)


✅投稿一覧、配列からの取り出し「@posts.each do |post|」、doの前後はスペース、ということを忘れがち(ピリオドを打ってしまったり)
✅配列「@posts」から取り出した一件のデータは変数「post」に入れてあるのに、「@post」と書いて✖️
✅アクション記述でのpostsテーブル全件取得、「@posts = Post.all」まで書いて満足してしまい、降順にする「.order(created_at: :desc)」を忘れて✖️ (いつもやってしまう)

✅投稿詳細ページ、””の中に変数等を置くための「#{  }」が身についておらず混乱
index.html(投稿一覧)からのリンク記述は「link_to( post.content, "/posts/#{ post.id }")」だったが、またも「"/posts/#{ @post.id "}」と、@を付けてしまい✖️

単純なスペルミス(結局これが一番多くて一番見つけにくかったり)
✅エディタの補完入力「""」(一回打ったら2つ出る/中から消すと2つとも消える)で、誤って「"」1つだけにしてしまい、以降のコードが全て文字列とみなされてしまい✖️
カッコの不整合(足りない/足しすぎ/編集のどさくさで必要なものも削除してしまったり)
{}と[]の間違い(死ぬので要注意です)


進め方

1  目標物確認

操作画面、タブが左から順に
エディタ/ターミナル/ブラウザ/データベース の4

エディタとターミナルに入力して課題を進める。
ブラウザとデータベースのタブは確認・閲覧。

エディタ画面は、左上のフォルダマークから、ファイルを開いた数だけタブができる。
開き直し以外でタブの順序は変えられない(変えたい)。


2  アプリケーションを用意しよう

初期画面になってるターミナルで

rails new tweet_app
を入力して、アプリのフォルダ構成が自動生成。

rails s
で、起動。

ブラウザに移って、URL「localhost:3000」でEnter
→ Yay! You're on Rails!

(ヤイ?? イェイ??) \\└( '∀' )┘//イェイ!



3  トップページを作ろう

ターミナルで
rails g controller home top

で、homeフォルダができるので、エディタに移ってフォルダマークから、
tweet_app / app / views / home / top.html.erb
を開いて、手順書のHTMLをコピペ。

次に、
tweet_app / app / assets / stylesheets / home.scss
を開いて、手順書のCSSをコピペ。

ブラウザのURLの末尾に「/home/top」を足してEnter
→ トップ画面が表示される


4  URLを変更しよう

編集すべきファイルの場所、覚えてなくて、
これが最初は大変!

app / config

の中の、下から3番目の「routes.rb」を開く。

get "home/top" => "home#top"
とあるのを、
get "/" => "home#top"
に修正(※常に自動保存されてるので保存不要)

ブラウザ「localhost:3000/home/top」で表示してたのが、
「localhost:3000」(ホーム)でそのまま表示されるようになる

前回のhome/topのURLはエラーになるので(「Routing Error」と赤い画面で表示されててビビる)
「home/top」を削除してEnter、改めてトップページを表示して終了。


5  サービス紹介ページを作ろう

手動でaboutを作る。

ビュー
ルーティング
アクション

新しいファイルを作るのは、ビュー。
home.html.erb があるフォルダで右クリックして、
「about.html.erb」と入力して決定。

できたファイルをポチッとしてエディット画面で開く。
手順書のHTMLをコピペ。

さっき開いたままのroutes.rbの
get "/" => "home#top"
の下に、
get "about" => "home#about"
を書く。

ルーティングができたので、あとはアクション。
homeのコントローラーを開く。

/ app / controller / home_controller.rb
を開く。

def top
end

の下に、

def about
end

を書く。


ブラウザに移って「/about」を入力
(「localhost:3000/about」だけど、前半は全URL共通なので割愛)
※aboutはtopと同じhomeフォルダ内にあるので、cssファイルは同じものが適用される


6  ヘッダーを作ろう

app / views / layouts / application.html.erb
を開く。

<body>
<%= yield %>

の間に改行を挟んで、手順書のHTMLをコピペする。

TweetApp
TweetAppとは

となってる行を、それぞれ

<%= link_to("TweetApp", "/") %>
<%= link_to("TweetAppとは", "/about") %>

に編集。

ブラウザに移って、ヘッダーの左右にリンクがあるのを確認。
topとaboutに、それぞれ飛べることを確認して終了。


❗️
7  モデルとテーブルを作ろう

ターミナルで
rails g model Post content:text

を実行。

rails db:migrate

で、自動生成されたマイグレーションファイルの通りにpostsテーブル作成。
「データベース」タブに初めて移動して、
「id」や「content」等のカラムができてることを確認する。

ターミナルに戻って
rails console
で、そのままコンソールモードへ。

post = Post.new(content: "てきとう1")
でEnter.

post.save
でEnter.

Content欄に「てきとう1」が入ったレコードが登録されたか、
データベースタブで確認。

ターミナルに戻って、
コンソールモードでそのまま、「てきとう2」も入力してsaveしておく。(また確認も)

終了前にコンソールモードから出た方が良いので、
「quit」で通常のターミナルに。

そのまま終了で良いと思うけど、ダメと言われることがある。
そしたらターミナルで「rails db:migrate」をもう一度実行。したら終われた。


❗️
8  投稿一覧ページを作ろう

がんばる。

ターミナルで
rails g controller posts index

を実行して、postsコントローラーとindex.html.erbのビューファイルを自動生成。

ルーティングファイルrouets.rbを開いて、
以下が自動で追加されてることを確認する。

get "posts/index" => "posts#index"

さっきのhomeと同じ要領で、index.html.erbとpost.controllerを探して開く。
posts.controller.rb で、

def index
end

の間に
@posts = Post.all

の処理を追加する(postsテーブルからレコード全件を取得して配列に入れる)。
その全件を、新しい順に表示したいので、次のように書き足して降順にする。

@posts = Post.all.order(created_at: :desc)

index.htmlに移動して、手順にあるHTMLをコピペして、編集する。

<% each文を用いてください %>

<%= 投稿の内容 %>

<% each文を閉じてください %>

を、それぞれ

<% @posts.each do |post| %>

<%= post.content %>

<% end %>

に編集。
自動生成されたcssを開いて、手順のをコピペ。


ヘッダーに「投稿一覧」を追加するために、
application.html.erbを開いて、

<li>
<%= link_to("TweetAppとは", "/about") %>
</li>

の三行をコピーして、直下にペースト。して、リンク修正する

<li>
<%= link_to("TweetAppとは", "/about") %>
</li>
<li>
<%= link_to("投稿一覧", "/posts/index") %>
</li>

ブラウザタブで「投稿一覧」のリンクがヘッダーにできてることと、
リンクを飛んで、データの中身が上から新しい順に表示されてることを確認して終了。


9   投稿詳細ページを作ろう

ルーティング/アクション/ビュー を作成。
でもその前に、投稿一覧画面から飛べるように、リンクを作る。

index.html.erbの

<%= post.content %>

だったところを、

<%= link_to(post.content, "/posts/#{post.id}") %>

に修正する。

※一覧表示はcontentのままで、リンクが「そのpostのid」になるように
「post.id」を指定。ただ""内にそのまま書くと、ただの文字列として認識されてしまうので、
文字列じゃないよ!と分かってもらうために「#{ }」の中に入れる。


これでリンクができたので、やっと投稿詳細ページの
ルーティング/アクション/ビュー の作成に入れる。


・ルーティング
routes.rbの編集画面で、controllerのどのアクションへ飛ぶかを指定。
indexのルーティングをコピペで二行にして、下側を編集。

get "posts/index" => "posts#index"
get "posts/index" => "posts#index"

投稿一覧でどの投稿(id)をクリックしたかによって表示内容を変えるので、引数として「:id」を指定
→ postsコントローラの「show」に飛ばすので、行き先は「posts#show」 にする

get "posts/:id" => "posts#show"


行き先に指定した「show」アクションを定義するために、posts_controller.rbへ移動

def index
@posts = Post.all.order(created_at: :desc)
end

の下に

def show
end

を定義。間に、投稿を表示するための処理を間に書く。

※endを忘れない
※ファイル内、一番左下の「end」は、クラスファイルの終了を宣言しているendなので、
 絶対消さない/新たに作るアクションの「end」に使わない

def show
@post = Post.find_by(id: params[:id])
end

※一覧画面と違って、データを一件だけ取ってくるので「@post」と単数形の変数にする
全件の「all」でなく、一件取得の「find_by」にする。

※投稿一覧のindex.html.erbに書いたURL「posts/:id」の「:id」部分(1とか2とか)を使って、
postsテーブルからそのidのデータをとってくるので、id: params[id] となる。


・ビュー
app / views/ posts にカーソルを合わせて右クリック
aboutを作ったときと同じように、手動で「show.html.erb」を作成して、開く。
手順欄のHTMLをコピペ。cssはさっきのposts.scssが適用されるので編集不要。

<%= 投稿の内容 %>

<%= 投稿の作成時刻 %>

の部分を、

<%= @post.content %>

<%= @post.crated_by %>

に編集。


ブラウザタブに移って、投稿一覧画面から、リンクを飛んで、
その投稿の詳細ページが表示されるか確認する。

おしまい!

スクリーンショット 2020-02-28 16.11.13


この記事が気に入ったらサポートをしてみませんか?