よこのじ(@yokonoji_work)です。
この記事は、Ruby on Rails で使うコマンドや構文の記述をまとめたものです。
開発中の辞書代わりに、ご利用ください。
- Ruby on Rails のコマンド
- Ruby on Rails の構文(ソースコード)
- post = Post.new(content: “Hello World”)
- post.save
- post = Post.first
- post = Post.all
- @変数
- 共通のレイアウト
- post = Post.find_by(id: 1)
- get “posts/:id” => “posts#show”
- link_to(post.content, “/posts/#{post.id}”)
- form_tag(“/posts/create”) do
- redirect_to(“/posts/index”)
- <textarea name=”content”></textarea>
- Post.all.order(id: :desc)
- post.destroy
- {method: “post”}
- validates :content, {presence: true}
- validates :content, {length: {maximum: 140}}
- saveメソッドの戻り値
- renderメソッド
- @post.errors.full_messages
- 変数 flash[:notice]
- validates :email, {uniqueness: true}
- form_tag(“~”, {multipart: true}) do
- ファイルを作成する
- 変数 session
- before_action
- params
- whereメソッド
- link_toメソッドにHTMLコードを記述する
- count メソッド
- authenticate メソッド
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