自学-堅牢なシステム設計(Rails)②

前回記事:自学-堅牢なシステム設計(Rails)の続き



   example "suspendflgをセットする" do
        params_hash.merge!(suspended: true)
        patch admin_staff_members_url(staff_member),
            params_hash: {staff_member: params_hash}
        staff_member.reload
        expect(staff_member).to be_suspended
    end
 
    example "hashed_passwordの値は下記かえ不可" do
        params_hash.delete(:password)
        params_hash.merge!(hashed_password: "x")
        expect {
            patch admin_staff_members_url(staff_member),
                params: {staff_member: params_hash}
    }.not_to change {staff_member.hashed_password.to_s}
    end




  • params_hashのmergeメソッドで一部の値を入れ替える
  • patchメソッドは部分置換で、paramsの二つのパラメータを送る
  • StaffMemberオブジェクトをリロードして、各属性値をDBから再取得する
  • be_suspendedはマッチャーとして定義されていない。
  • Rspecは内部挙動として、be_xxxがあれば、prefixを消して、suffixに?を付けたメソッドを呼び出す
  • なので、staff_memberのsuspended?を呼んでいる
  • hashed_passwordが変更できないことの試験
  • expect {x}.not_to change {Y}は、属性値が変更しないことを検証するテンプレ
  • hashed_password.to_sのto_sの理由は、BCrypt::Passwordオブジェクトは生パスワードを比較するが、changeマッチャーは値の変化を調べるので、整合性が取れないから
400 Bad Requestを使う場面
  • Paramaterが間違っている状態なので、「400 Bad Request」を使う
  • ErrorHandlerモジュールに例外処理メソッドrescue400を作成する
  • それをクラスメソッドrescue_fromで例外ハンドラとして登録する
module ErrorHandler
    extend ActiveSupport::Concern

    included do
        rescue_from StandardError, with: :rescue500
        rescue_from ApplicationController::Forbidden, with: :rescue403
        rescue_from ApplicationController::IpAddressRejected, with: :rescue403
        rescue_from ActiveRecord::RecordNotFound, with: :rescue404
        rescue_from ActionController::ParameterMissing, with: :rescue400
    end

    private def rescue400(e)
        render "error/bad_request", status: 400
    end
テンプレートも作る

400 Bad Request

不正な要求です
一般ユーザーによるアカウント管理機能
bin/rails g controller staff/accounts

スタッフ自身のアクション定義
class Staff::AccountsController < Staff::Base
    def show
        @staff_member = current_staff_member
    end

    def edit
        @staff_member = current_staff_member
    end

    def update
        @staff_member = current_staff_member
        @staff_member.assign_attributes(staff_member_params)
        if @staff_member.save
            flash.notice = "更新"
            redirect_to :staff_account
        else
            render action: "edit"
        end
    end

    private def staff_member_params
        params.require(:staff_member_params).permit(
            :email, :family_name, :given_name,
            :family_name_kana, :given_name_kana
        )
    end
end

----


Next Post Previous Post
No Comment
Add Comment
comment url