LoginSignup
0
0

More than 3 years have passed since last update.

【知識用】コントローラでよく使われる機能5つ

Last updated at Posted at 2020-08-29

目次

コントローラでよく使われる機能は次の5つ

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でよく使われる機能たち。
しっかりこれらを使いこなせるようにしておこう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0