Railsの立ち上げ
$ rails new アプリケーション名 例) rails new tweet_app
$ rails server
上記入力後、ブラウザのurlに「localhost:3000」を入力し、「Yay!You're on Rails!」と書いてあるページが表示されていればOK
ページ作成
○ページ作成に必要なもの
・ ビュー
・ コントローラ
・ ルーティング
ビュー
ビューとは、ページの見た目を作るHTMLファイルのこと。
$ rails generate controller コントローラ名 アクション名
例)rails generate controller home top または、 rails g controller home top でもOK
「rails g controller home top」でviewsフォルダの中にhomeフォルダとtop.html.erbファイルが作成される。
<h1>Home#top</h1>
<p>Find me in app/views/home/top.html.erb</p>
コントローラ
ページを表示するとき、railsではコントローラを経由して、ブラウザに返している。
先ほど、「rails g controller home top」を実行したとき、同時にコントローラも作成されており、コントローラファイルの場所は、「app/controllers/home_controller.rb」である。
また、rails g controllerでtopアクションも指定しているため、home_controller.rbの中身は以下のようになっている。
class HomeController < ApplicationController
def top #アクション
end
end
コントローラ内のアクションは、コントローラと同じ名前のビューフォルダから、アクションと同じ名前のHTMLファイルを探して、ブラウザに返す役割を担っている
ルーティング
ページを表示するときコントローラを経由していたが、ブラウザとコントローラを結ぶ役割がルーティングである。
ルーティングは対応表にして考えるとわかりやすい
URL | コントローラ | アクション |
---|---|---|
home/top | home | top |
ルーティングが定義されている場所は、「config/routes.rb」で、中身は以下のようになっている
Rails.application.routes.draw do
#get "URL" => "コントローラ名#アクション名"
get "home/top" => "home#top" #localhost:3000/home/top
#URLの部分を「top」に変えると、localhost:3000/topでアクセスできるようになる
get "top" => "home#top" #localhost:3000/top
#トップページの場合は、URLの部分を"/"にする
get "/" => "home#top"
end
CSSファイルや画像を保存するファイルの場所
○CSSファイル
「app/assets/stylesheets/コントローラ名.scss」
○画像を保存するファイル
「public/画像名」
<% %>と<%= %>
<% %>は中身が表示されないので、変数の定義などに使われる。
<%= %>は中身が表示される。
<% language = "Ruby" %>
<%= language %>を学ぼう
Rubyを学ぼう
<% language %>を学ぼう
を学ぼう
@変数
通常、アクションで定義した変数をビューでそのまま使用することはできない。
そこで、「@変数」とすることで、ビューでも使えるようにする。
class PostsController < ApplicationController
def index
@post1 = "hogehoge"
post2 = "fugafuga"
end
end
<%= @post1 %>
hogehoge
<%= post2 %>
※エラー発生
テーブル作成(モデルとマイグレーション)
$ rails g model モデル名 カラム名:データ型
例) rails g model Post content:text
上記をターミナルに入力し実行すると、「モデルが定義されたファイル」と「マイグレーションファイル」の2つファイルが生成される。
モデルが定義されたファイルの場所は、「app/models/ファイル名.rb」(ファイル名は単数形)
class Post < ApplicationRecord
end
マイグレーションファイルの場所は、「db/migrate/マイグレーション名.rb」
class CreatePosts < ActiveRecord::Migration[5.0]
def change
create_table :posts do |t|
t.text :content
t.timestamps
end
end
end
マイグレーションファイルを使って、データベースに変更を反映するにはターミナルに以下を実行する
$ rails db:migrate
rails console
rails consoleはRubyのコードを手軽に実行できる。「quit」でやめることができる。
$ rails console
Loading Development environment (Rails 5.0.1)
[1]pry(main) > 1 + 1
=> 2
[2]pry(main) > text = "Hello"
=> "Hello"
[3]pry(main) > text + "World"
=> "HelloWorld"
[3]pry(main) > quit
saveメソッド
saveメソッドはデータベースに保存するメソッド。
例えば、作成したPostインスタンスをpostsテーブルに保存するとき。(このとき、saveメソッドが使えるのは、PostモデルがApplicationRecordを継承しているから)
$ rails console
> post = Post.new(content: "Hello World")
> post.save
firstメソッド
firstメソッドはテーブルの最初のデータを取得できる。
postsテーブル
id | content |
---|---|
1 | hogehoge |
2 | fugafuga |
> post = Post.first
> post.content
=> "hogehoge"
allメソッド
allメソッドはテーブルの全てのデータを取得できる。
index番号を指定することで特定の箇所のデータを取得することもできる。
postsテーブル
id | content |
---|---|
1 | hogehoge |
2 | fugafuga |
> post = Post.all[1].content
=> "fugafuga"
link_toメソッド
link_toメソッドは「第一引数に表示する文字」、「第二引数にURL」
<%= link_to("News", "/news") %>
↓ 以下のように変換される
<a href="/news">News</a>
find_byメソッド
find_byメソッドは、特定のidの投稿を取得できる。(allメソッドのindex番号指定でも同じことができる)
postsテーブル
id | content |
---|---|
1 | hogehoge |
2 | fugafuga |
> post = Post.find_by(id: 1)
> post.content
=> "hogehoge"
変数Params
変数Paramsは、ルーティングで設定したURLの「:id」の値を取得できる。
コントローラのアクション内で使う。
例)ルーティングを「localhost:3000/posts/1」に設定した場合
get "post/:id" => "post#show"
def show
@id = params[:id]
end
<%= @id %>
結果は「1」と出る
ルーティングでデータベースに変更を加えるアクションの場合は「get」ではなく「post」
post "posts/create" => "posts#create"
form_tagメソッド
form_tagメソッドは、フォームに入力されたデータを送信することができる。
「form_tag(送信先のURL) do」のように送信先のURLを指定し、そこにデータを送信する。
<%= form_tag("/posts/create") do %>
<textarea name="content"></textarea>
<input type="submit" value="投稿">
<% end %>
name属性を指定したフォームに入力されたデータは、コントローラのアクション内で受け取ることができる。
フォームのデータは変数paramsで受け取る。
paramsはname属性に設定した文字列をキーとしたハッシュになっている。
def create
params[:content]
end
#textareaでhogehogeと打って投稿ボタンを押すと、params[:content]にはhogehogeというデータが入ってくる
redirect_toメソッド
redirect_toメソッドは、他のURLに転送することができる。
「redirect_to("URL")」とすることで、そのページに転送することができる。
def create
redirect_to("/posts/index")
end