Ruby on Rails コマンドや構文の記述 一覧

よこのじ(@yokonoji_work)です。

この記事は、Ruby on Rails で使うコマンドや構文の記述をまとめたものです。

開発中の辞書代わりに、ご利用ください。

Ruby on Rails のコマンド

rails new アプリケーション名

アプリケーション名と同じ名前のフォルダが生成され、フォルダの中には必要なフォルダやファイルが入っている。

rails server

Webサーバーを起動する(Railsにデフォルトで付属しているPuma)。

rails generate controller top index

localhost:3000/top/index というページが生成される。

このとき、viewsフォルダの中に「topフォルダ」と「index.html.erb」というファイルが作成される。さらに、「top_controller.rb」というコントローラのファイルが作成され、ファイルの中に「indexメソッド(アクション)」が追加される。

同じコントローラ名(この場合はtop)を含む場合は、2度目以降コマンドを実行することはできないので、手動でアクション(メソッド)とViewファイルを追加する。

rails g model Post content:text

text型のcontentというカラムを持つ、postsテーブルを作成する。コマンドにはPostという先頭大文字の単数形で記述する。

なお、このコマンドではマイグレーションファイルと呼ばれる、データベースに変更を指示するためのファイルを作成するだけ。ファイルはdb/migrateフォルダに作成される。

また、rails db:migrate実行後に、app/modelsフォルダの中にPostモデルが定義された「post.rb」ファイルが作成される。

rails db:migrate

rails g model で作成したマイグレーションファイルの内容を反映させるために実行するコマンド。

id, create_at, updated_at という3つのカラムが自動で作成される。

rails console

コンソールを実行する。「quit」でコンソールを終了する。

rails g migration ファイル名

rails g model コマンドでは、モデルとマイグレーションファイルが作成されてしまうので、マイグレーションファイルのみ作成する場合は、rails g migration を使用する。ファイルは/db/migrateフォルダに作成される。

rails db:migrate は作成したファイル内のchangeメソッドを実行するもので、changeメソッド内にテーブルの変更内容を記述する。

カラムを追加する場合は、次のように記述する。

add_column :テーブル名, :カラム名, :データ型
add_column :posts, :name, :string

数値なら :integer

gem ‘bcrypt’

bcryptはパスワードを暗号化するのに利用できるgem。Gemfileに追記した後、bundle installして使う。

bcryptを入れると、has_secure_password メソッドを使うことができる。

これはパスワードを暗号化してくれるメソッドで、モデルに記述を行う。また、このメソッドを使うとパスワードが存在するかどうかのチェックもしてくれるので。存在確認のバリデーションは不要となる。

class User < ApplicationRecord
  has_secure_password

暗号化されたパスワードは password_digest カラムに保存されるため、カラムを作成しておきます。

rails g migration ファイル名 でマイグレーションファイルを作って・・・。password_digest の追加と password の削除を行います。

def change
  add_column :users, :password_digest, :string
  remove_column :users, :password, :string
end

Ruby on Rails の構文(ソースコード)

post = Post.new(content: “Hello World”)

contentカラムにHello WorldをもつPostインスタンスを作成する。

コントローラ ファイルのアクション内でデータベースから変数に内容を取り出すように使う。また、コンソール内でも実行できる。

post.save

post変数に代入したPostインスタンスの内容をテーブルに保存する。変数名.saveと記述する。

post = Post.first

postsテーブルから最初のレコード(行)を取り出す。post.contentとすれば、取り出したレコードからcontentカラムの内容を取り出せる。

post = Post.all

postsテーブルからすべてのレコードを配列で取り出す。

Post.all[0]のようにインデックス番号で指定でき、Post.all[0].contentとすればcontentカラムの内容を取り出せる(posts[0].contentでも良い)

@変数

@を付けて変数を定義することで、アクション内で定義した変数をビューでも利用できるようになる。

共通のレイアウト

各ページで共通するレイアウトは views/layouts/application.html.erb に書いておくことができる。このファイル内で<%= yield %>を記述しておけば、他のページの内容はここに代入されるため。

post = Post.find_by(id: 1)

find_byメソッドで指定したカラムから指定した値を持つデータを取得する。

post.created_at のように指定すると特定のカラムの情報を取得できる。

get “posts/:id” => “posts#show”

/posts/1, /posts/2 という形でURLにidを持たせるときのルーティングの記述。

ルーティングで設定したURLの「:id」は、コントローラのアクション内で @id = params[:id] のように扱うことができる。

link_to(post.content, “/posts/#{post.id}”)

link_to(“表示内容”, “URL”) とすることでリンクを記述できる。

form_tag(“/posts/create”) do

<%= form_tag("送信先URL") do %>
  <textarea></textarea>
  <input type="submit" value="投稿">
<% end %>

/posts/create というルーティングで指定したURLを設定することで、inputボタンを押すと内容がcreateアクションに送信される。

データベースの変更を伴う場合のルーティングは post “posts/create” => “posts#create” のようにgetではなくpostを使用する。

link_toメソッドはデフォルトでgetのルーティングを探し、form_tagメソッドはデフォルトでpostのルーティングを探す。

redirect_to(“/posts/index”)

指定したURLにリダイレクトさせることができる。

上の/posts/createの例では、フォームを送信するだけでcreateに対応するビューがないため、createアクション内で/posts/indexにリダイレクトさせるような使い方ができる。

<textarea name=”content”></textarea>

name属性で指定したcontentをキーとしたハッシュがrailsに送られて、アクション内にてparams[:content]で取得できる。

これをデータベースに保存するには、@post = Post.new(content: params[:content])と記述する(@post.saveを忘れずに)。

Post.all.order(id: :desc)

指定したカラムを基準にデータの並び替えを行うことができる。

:descで降順、:ascで昇順となる。

post.destroy

レコードを削除する。

post = Post.find_by(id: 1) のように対象のレコードを取得した後にpost.destroyで削除を実行する。

{method: “post”}

link_toメソッドはルーティングのgetを探しに行く。そのため、削除ボタンのようにpostで書くルーティングを見つけてくれない。

そんなときは、第三引数に{method: “post”}を書くことでpostで書かれたルーティングをさがしてくれるようにする。

link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"})

validates :content, {presence: true}

contentカラムの内容が存在するかチェックする。

validates :content, {length: {maximum: 140}}

最大140文字に制限するためのチェック。

validates :content, {presence: true, length: {maximum: 140}} のように条件を複数指定することができる。

saveメソッドの戻り値

saveメソッドは、保存に成功したときにtrue、失敗したときにfalseを返すので、if @post.save のようにif文で使用することができる。

renderメソッド

renderメソッドを用いると、別のアクションを経由せずに直接ビューを表示することができる。render(“フォルダ名/ファイル名”) のように表示したいビューを指定する。

redirect_toメソッドを使った場合と異なり、そのアクション内で定義した@変数をビューで使うことができる。

これを利用すると、投稿の編集時にバリデーションにかかっても編集中の内容が消えずに残る(元の投稿内容で上書き表示されない)。

@post.errors.full_messages

バリデーションに失敗するとエラーメッセージが自動で生成され、errors.full_messages でその内容をとりだすことができる。

先ほどのバリデーションの場合だと「Contentを入力してください」「Contentは140文字以内で入力してください。」と表示される。

変数 flash[:notice]

flash[:notice] = “フラッシュメッセージ” のようにフラッシュメッセージを代入することができる。フラッシュメッセージは一度表示されたあとに自動で消える。

ビューファイルにて <%= flash[:notice] %> の記述で表示させる。

validates :email, {uniqueness: true}

uniqueness: true は重複がないかをチェックするためのバリデーション。

form_tag(“~”, {multipart: true}) do

画像のフォーム <input name=”image” type=”file”> を使うときのform_tagには第二引数に{multipart: true}を付け加える必要がある。

ファイルを作成する

指定したフォルダ・ファイル名で、指定した内容が書かれたファイルを作成する。

File.write(ファイルの場所, ファイルの中身)
File.write("public/sample.txt", "Hello World")

画像の場合は File.binwrite を用いることと、取得した画像にreadメソッドを当てる必要があることを忘れないように。

image = params[:image]
File.binwrite("public/user_images/#{@user.image_name}", image.read)

変数 session

sessionに代入された値はブラウザに保存されるため、ページを移動してもその情報を保持できる。

session[:キー名] = 値 のように記述する。

sessionを変更するときのルーティングはpostである点に注意。

before_action

application.html.erb の <%= yield %> で各アクションの対応するビューが表示されるため、application.html.erb で変数を使う場合は工夫が必要となる。

そこで、before_action を使えば、全アクションで共通する処理を1箇所に書くことができる(applicaitonコントローラに記述する)。

before_action :example

def example
  @user = ~~~
end

また、あるページではログイン状態のみアクセスできるようにしたい場合もbefore_actionを用いる。

applicaitonコントローラでメソッドを定義する(各コントローラは、applicaitonコントローラの内容を継承している)。@変数は同一コントローラのメソッド間で共通して使用できるので、ここでは改めて@変数を定義していない。

def authenticate
  if @current_user == nil
    flash[:notice] = "ログインが必要です"
    redirect_to("/login")
  end
end

userコントローラ内のアクションのみに制限をかけるので、userコントローラでbefore_actionを記述する。

このとき、onlyを使用することで指定のアクションでのみ実行することができる。

before_action :authenticate, {only: [:index, :show, :edit]}

params

params[:id] のようにparamsを使って取得したデータは文字列になっている。そのため、数値として計算する場合は to_i メソッドを用いる必要がある。

whereメソッド

find_byメソッドでは1つのデータしか取得できないが、whereメソッドなら条件に合致する複数のデータを取得することができる。

posts = Post.where(id: 1)

配列で取得できるので、posts[0].content として必要な情報を取り出せる。

link_toメソッドにHTMLコードを記述する

通常 link_to(“アンカーテキスト”, “URL”) と記述するが、アイコンを使う場合にアンカーテキスト部分にHTMLコードを書いても文字列として出力されるだけ。

この場合は、次のように記述すればよい。

<%= link_to("URL") do %>
  <span>~~</span>
<% end %>

count メソッド

Like.where( ).count のように記述すると、whereで取得したデータの件数を取得できる。

authenticate メソッド

authenticateメソッドは渡された引数を暗号化し、password_digestの値と一致するかどうかを判定してくれる。has_secure_passwordメソッドを有効にすると、authenticateメソッドが使える。

これにより、IDとパスワードの認証方法が変わる。

暗号化しないパスワードを用いる場合は、ID(email)とパスワードが一致するユーザーを探すが、authenticateメソッドを用いる場合は、ID(email)でユーザーを探して、authenticateでpasswordを暗号化したものがpassword_digestと一致するかを確認する。

変更前
@user = User.find_by(email: params[:email], password: params[:password])
  if @user
    session[:user_id] = @user.id

変更後
@user = User.find_by(email: params[:email])
  if @user && @user.authenticate(params[:password])
    session[:user_id] = @user.id