AR삽질러

Rails 一日一つメソッド (Day17) respond_toメソッド 본문

Ruby/RubyOnRails-日本語

Rails 一日一つメソッド (Day17) respond_toメソッド

아랑팡팡 2024. 1. 8. 11:12
728x90

 

Rails 一日一つメソッド (Day17) respond_toメソッド

 

respond_toメソッドとは

 - リクエストで指定されたフォーマットによって処理を分ける事ができるメソッド。

 

respond_toメソッド基本構文

 - respond_toメソッドのブロック引数 formatを使って format.形式と記述すると、指定した形式ごとに処理を分ける事ができる。

respond_to do |format|
	format.形式 { 処理 }
end

 

例)indexアクション内で、「HTML形式、JSON形式、JS形式」の各フォーマットのリクエストによって処理を分けたい場合

class UsersControlelr < ApplicationController
	def index
    	respond_to do |format|
        	format.html # requestされるフォーマットがHTML形式の場合
            format.json { 処理 } # requestされるフォーマットがJSON形式の場合
            format.js { 処理 } # requestされるフォーマットがJS形式の場合
        end
    end
end

 - respond_toはリクエストされた Accept Headerを元に responseフォーマットを決める

 form.html

  - ClientがXML形式でResponseを望む時に、基本的に show.html.erb Viewをレンダリングする。

 form.json

  - ClientがXML形式でResponseを望む時に、@userオブジェクトをJSONフォーマットでレンダリングする。

 form.js

  - ClientがXML形式でResponseを望む時に、@userオブジェクトをXMLフォーマットでレンダリングする。


SessionsControllerでのrespond_toの使用

 - SessionsControllerの createアクションでは respond_toはログインの試みが成功したかどうかに応じて、異なる形式の応答を提供するために使用。

class SessionsController < ApplicationController
  def create
    user = User.find_by(email: params[:email].downcase)

    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
      redirect_to main_path(user)
    else
      message = user.nil? ? '등록된 회원이 아닙니다!' : '비밀번호가 정확하지 않습니다.'
      respond_to do |format|
        format.turbo_stream { render turbo_stream: turbo_stream.update('login_errors', partial: 'sessions/login_error', locals: { message: message }) }
        format.html { flash.now[:alert] = message; render 'new' }
      end
    end
  end
end

createアクション

 - ユーザーのログインロジックを処理するコードで、ユーザーが提供したEmailとPasswordでユーザーを認証し、成功または失敗によって違うResponseを提供する。

 

user = User.find_by(email: params[:email].downcase) - 入力されたEmailを小文字で変換した後、ユーザーをDataBaseから探す。if user && user.authenticate(params[:password]) - has_secure_passwordによって提供される authenciateメソッドで、入力されたPasswordがユーザーのPasswordと一致することを確認する。

 

Loginに成功した時の処理 session[:user_id] = user.id  - ユーザーのIDをsessionに保存する。 redirect_to main_path(user)

  - ユーザーをmain_pathにリダイレクションする

 

Loginに失敗した時

 - ログインに失敗した場合は、エラー メッセージを設定し、 ユーザーがいない場合は 「登録された会員ではありません!」、パスワードが間違っている場合は 「パスワードが正しくありません」というメッセージを使用する。

 

 respond_toブロックを使用して、Clientの要求形式に応じて異なる応答を提供する

 format.turbo_stream

   - Turbo Stream形式にリクエストする時、turbo_stream.updateを使ってPageの特定の部分に login_errorsを sessions/login_errorテンプレートに更新する。

 format.html 

 - HTML形式でリクエストする時、flash.now[:alert] = messageを通じて現在リクエストだけに表紙されるflashメッセージを設定し、newにレンダリングする。

 

728x90
반응형
LIST