目次
コントローラでよく使われる機能は次の5つ
- params: https://www.sejuku.net/blog/29763
- redirect_to: https://www.sejuku.net/blog/27603
- flash: https://pikawaka.com/rails/flash
- render: https://www.sejuku.net/blog/14032
- respond_to: https://www.sejuku.net/blog/14032
paramsにまつわるもの
params(requireやpermitとのあわせ技)
送られてきた値を受け取るためのメソッド。
notes_controller.rb
class NotesController < ApplicationController
def index
@note = Note.all
end
def new
@note = Note.new
end
def create
@note = Note.new(notes_params)
if @note.save
redirect_to root_path
else
render :new
end
end
def notes_params
params.require(:note).permit(:title, :content)
end
end
こんな感じで使う。
requireで必要なテーブルを指定して
permitで許可するカラムを指定するという感じ。
これをストロングパラメータという。
redirect_toにまつわるもの
redirect_to
上記にもありますが、自動的にページを切り替えるためのメソッド。
notes_controller.rb
class NotesController < ApplicationController
def create
@note = Note.new(notes_params)
if @note.save
redirect_to root_path
else
render :new
end
end
def notes_params
params.require(:note).permit(:title, :content)
end
end
こんな感じで指定したパスに自動遷移する感じ。
redirect_back
前のページに戻るためのメソッド。
notes_controller.rb
class NotesController < ApplicationController
def create
@note = Note.new(notes_params)
if @note.save
redirect_back(fallback_location: notes_path)
else
render :index
end
end
def notes_params
params.require(:note).permit(:title, :content)
end
end
こんな感じで指定したパスに自動で戻る感じ。
flashに関して
flashの基本
ページ遷移時に簡易メッセージを送ることができるメソッド。
以下のキー名には、基本的にnoticeかalertを入れる。
notes_controller.rb
class NotesController < ApplicationController
def create
@note = Note.new(notes_params)
if @note.save
flash[:キー名] = "表示させたいメッセージ"
redirect_to root_path
else
render :new
end
end
def notes_params
params.require(:note).permit(:title, :content)
end
end
flash用の部分テンプレート
layouts/_flash.html.haml
.notifications
- flash.each do |key, value|
= content_tag(:div, value, class: key)
このときのコントローラは
notes_controller.rb
class NotesController < ApplicationController
def create
@note = Note.new(notes_params)
if @note.save
redirect_to root_path, notice: "ノートが保存されました"
else
flash.now[:alert] = "保存できませんでした"
render :new
end
end
private
def notes_params
params.require(:note).permit(:title, :content)
end
end
上記のようにredirect_toと組み合わせて使うときは特殊な書き方ができる。renderと組み合わせて使うときはflash.nowを使う。
そうすると、それぞれ一回のflash表示で済む。
renderについて
renderは使い方が色々ある。
コントローラとビューで使える。
またJSONやXML形式に変換することができる。
コントローラではテンプレートを呼び出す
テンプレートを呼び出す
pages_controller.rb
class PagesController < ApplicationController
def index
render "help"
end
def help
end
end
pages_controller.rb
class PagesController < ApplicationController
def index
end
def help
end
end
indexのページからhelpのページに見た目が変わる。
(ただし、パスは変わらず)
ビューでは部分テンプレートを呼び出す
基本バージョン
app/views/pages/_header.html.haml
app/views/pages/_footer.html.hamlを作成する。
app/views/pages/index.html.haml
= render 'header'
%h1
%span#Pagesindex Pages#index
%p Find me in app/views/pages/index.html.erb
= render 'footer'
変数を渡すバージョン
app/views/pages/index.html.haml
= render 'header'
%h1
%span#Pagesindex Pages#index
%p Find me in app/views/pages/index.html.erb
- @posts.each do |post|
= render partial: "post"
= render 'footer'
このときのコントローラは
pages_controller.rb
class PagesController < ApplicationController
def index
@posts = Post.all
end
def help
end
end
JSONやXMLといった形式を返す。
posts_controller.rb
class PostsController < ApplicationController
before_action :set_post, only: [:show, :edit, :update, :destroy]
# GET /posts
# GET /posts.json
def index
@posts = Post.all
respond_to do |format|
format.html
format.json {render :json => @posts}
format.xml {render :xml => @posts}
end
end
(以下省略)
respond_toについて
上記のように記述して、JSONやXML形式で取得する。
renderと組み合わせることで使える。
まとめ
以上がRailsでよく使われる機能たち。
しっかりこれらを使いこなせるようにしておこう。