13. モデル
app/models/blog.rb
class Blog < ActiveRecord::Base
end
本来はバリデーション/アソシエーション/ビジネスロジック等を書くけど、これでもDB操作は可能
% rails c
> blog = Blog.new
> blog.title = "test title"
> blog.body = "test body"
> blog.save # blogsテーブルに新規レコードを作成
> blogs = Blog.all # blogsテーブルの全てのレコードを取得
> blogs.each {|b| puts b.title} # 取得したレコードのtitleカラムを出力
> blog = Blog.find(1) # blogsテーブルからidが1のレコードを取得
> puts blog.title # titleカラムを出力
> blog.destroy # 取得したレコードをblogsテーブルから削除
モデルの操作例
13
14. ルーティング1
Tutorial::Application.routes.draw do
resources :blogs
end
config/routes.rb
% rake routes
Prefix Verb URI Pattern Controller#Action
blogs GET /blogs(.:format) blogs#index
POST /blogs(.:format) blogs#create
new_blog GET /blogs/new(.:format) blogs#new
edit_blog GET /blogs/:id/edit(.:format) blogs#edit
blog GET /blogs/:id(.:format) blogs#show
PATCH /blogs/:id(.:format) blogs#update
PUT /blogs/:id(.:format) blogs#update
DELETE /blogs/:id(.:format) blogs#destroy
上記のコードで設定されるルーティング
14
15. ルーティング2
個別にルーティング設定をする場合
Tutorial::Application.routes.draw do
controller :blogs do
# HTTPMethod URI, to: ExecMethod, as: :Prefix
# GET /index => BlogsController#index (index_path)
get :index, to: :index, as: :index
# POST /create => BlogsController#create (create_path)
post :create, to: :create, as: :create
# GET / => BlogsController#root (root_path)
get :root, to: "blogs#root"
end
end
15
16. コントローラ1
class BlogsController < ApplicationController
before_action :set_blog, only: [:show, :edit, :update, :destroy]
def index
@blogs = Blog.all
end
def new
@blog = Blog.new
end
private
def set_blog
@blog = Blog.find(params[:id])
end
def blog_params
params.require(:blog).permit(:title, :body)
end
end
app/controller/blogs_controller.rb
メソッドが無い又は空の場合はviewがレンダリングされる
16
24. ログイン認証機能を付ける2
% rails g controller sessions
ログイン/ログアウト用のSessionsコントローラを作成
Tutorial::Application.routes.draw do
resources :blogs
# 以下を追加
controller :sessions do
get :login, to: :new, as: :new_session
post :login, to: :create, as: :create_session
get :logout, to: :destroy, as: :delete_session
end
end
ルーティング設定
config/routes.rb
% rake routes
...
new_session GET /login(.:format) sessions#new
create_session POST /login(.:format) sessions#create
delete_session GET /logout(.:format) sessions#destroy
24
25. ログイン認証機能を付ける3
<%= form_tag(create_session_path) do %>
<% if flash[:alert] %>
<%= flash[:alert] %>
<% end %>
<%= text_field_tag :email, nil, placeholder: "Email" %>
<%= password_field_tag :password, nil, placeholder: "Password" %>
<%= submit_tag "Send" %>
<% end %>
ログインページ作成(新規作成)
app/views/sessions/new.html.erb
class SessionsController < ApplicationController
def create
render text: "login"
end
def destroy
render text: "logout"
end
end
SessionsControllerにcreate/destroyメソッドを追加しておく
app/controllers/sessions_controller.rb
25
26. ログイン認証機能を付ける4
% rails g model user email:string salt:string password:string
% rake db:migrate
ユーザモデル作成
class User < ActiveRecord::Base
include Passwd::ActiveRecord
define_column
end
Userモデル編集
app/models/user.rb
ユーザ作成
% rails c
> user = User.new
> user.email = "foo@example.com"
> user.set_password("secret")
> user.save
> puts password
26
27. ログイン認証機能を付ける5
class SessionsController < ApplicationController
def create
@user = User.authenticate(params[:email], params[:password])
if @user
session[:user] = @user.id
redirect_to blogs_path
else
flash.now[:alert] = "Email or password is incorrect."
render action: :new
end
end
def destroy
session[:user] = nil
redirect_to blogs_path
end
end
ログイン/ログアウト処理
app/controllers/session_controller.rb
27
28. ブログの作成等を制限する1
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
# 以下を追加
def require_logged_in
if session[:user].present?
begin
@user = User.find(session[:user])
rescue ActiveRecord::RecordNotFound
reset_session
end
end
redirect_to create_session_path unless @user
end
end
ログインチェックのメソッドをApplicationControllerに定義
app/controllers/application_controller.rb
application_controller.rbにメソッドを定義しておくと他のコントローラか
ら利用可能になる。
28