8/25-調べ

■index
  1. ActiveRecord::RecordInvalidについて
  2. unless response.code === 200 について
  3. %#06dについて
  4. webmockについて
  5. rest-clientについて
  6. ActiveSupport::Concernモジュール
  7. verify_ssl: Open::SSL::VERYFY_NONEについて
  8. paginate_perで配列に対するページャー
  9. class << selfについて
  10. 配列のconcatについて
  11. pluckについて
  12. 正規表現gsub(/...)について
  13. Model検索時のscope: lambda()について
  14. uniq.pluckについて
  15. left_joinsについて
  16. presenceメソッドについて
  17. ?? Oem.where(name: name)
  18. generate_accountについて
  19. モデル図とか
  20. to_sym
  21. Knock(2回目)
  22. snakeize_params
  23. エラーの4段評価
  24. before_action





ActiveRecord::RecordInvalidについて

  • Active Recordのバリデーション (検証: validation) 機能
  • オブジェクトがデータベースに保存される前にオブジェクトの状態を検証する方法
  • invalidは無効状態



②unless response.code === 200
  • if / unless で条件分岐
  • unless === xxx は、正解を一つだけにして、それ以外を許容しないハンドル



%#06dについて
  • ゼロパディング処理をしている
  • 6桁にして、隙間を前00で埋める処理
  • format("#{abc}%#06d",some_id)



webmockについて
  • 外部API呼び出しのあるアプリケーションを開発する場合、テストやローカル環境での動作確認まで本物のAPIを呼び出していると、時間がかかり開発の生産性が下がるのでAPIモックを使いたくなります。
  • そこでWebMockというGemを使うと、外部へのHTTPリクエストをスタブ化してくれるので、開発が非常にやりやすくなります。
  • WebMockを使えば外部API呼び出しのmockを自分で実装しなくても簡単にstub登録できます。
[実装例:api_stub.rb]
①レスポンスデータを事前に作成して、そのファイルを読み込むように指定
require 'webmock'

WebMock.enable! 

# GETリクエストのスタブ登録
WebMock.stub_request(:get, "http://www.example.com").to_return(
  body: File.read("#{Rails.root}/test/fixtures/stub_api_response.json"),
  status: 200,
  headers: { 'Content-Type' =>  'application/json' })

# PUTリクエストのスタブ登録  
WebMock.stub_request(:put, "http://www.example.com").to_return(
  body: '{"key": "value"}',
  status: 200,
  headers: { 'Content-Type' =>  'application/json' })

②APIのアクセス許可
WebMock.allow_net_connect!(:net_http_connect_on_start => true)
③RSpecファイルのスタブ化


rest-clientについて
  • 非オープンサービスのAPIを使うとき、APIクライアントが無いことが多い
  • なので、アプリケーションから使いたいAPIだけを叩くような簡易なAPIクライアントを自分で書く。
  • そのときはrest-clientあたりを使ってベタっと書いてしまうことがほとんど



ActiveSupport::Concernモジュール
  • Active SupportはRuby on Railsのコンポーネント
  • 役割はRuby言語の拡張、ユーティリティ、その他横断的な作業
  • Concernは、モジュールをインクルードした際に、インスタンスメソッドと一緒にクラスメソッドもインクルーダーに追加する機能をカプセル化したもの
  • モジュールにActiveSupport::Concernをエクステンドしておくことによって、クラスメソッドの追加機能を簡単に使える
※便利さが腹落ちしてないので、あとでまた読み返す用
[要するに]
モジュール作成において、クラスメソッドの追加が簡単になる処理ですよ!

A typical module looks like this:
module M
  def self.included(base)
    base.extend ClassMethods
    base.class_eval do
      scope :disabled, -> { where(disabled: true) }
    end
  end

  module ClassMethods
    ...
  end
end
By using ActiveSupport::Concern the above module could instead be written as:
require 'active_support/concern'

module M
  extend ActiveSupport::Concern

  included do
    scope :disabled, -> { where(disabled: true) }
  end

  class_methods do
    ...
  end
end
private class methodも同様に定義できる。(=セキュアな呼ばれるメソッド)
[参考]



verify_ssl: Open::SSL::VERYFY_NONEについて
  • RESTClient使用時のSSL証明書チェックを無視する設定

RestClient::Resource.new(
    Rails.application.credentials[Rails.env.to_sym][:api][:url_base],
    veryfy_ssl: OpenSSL::SSL::VERIFY_NONE,
)


⑧paginate_perでのページネーション


  • ページネーション機能を提供するGem
[実装]
  1. Models に pagenates_for = 10と登録
  2. Controllerに @items = Item.page(params[:page])とする
  3. Viewでレンダリングする
  4. Customer.pageに入っている
class << selfについて
  • クラスメソッドの定義方法のイディオム
  • クラスメソッドの定義方法は二つあるけど、記述が少ないほうのやつ
[イディオム]
# 特異クラスによるクラスメソッドの定義例
class Foo
    class << self
      def a_class_method
      end
  
      def another_class_method
        # 二つ定義しても self つけなくていいから便利!
      end
    end
  end




配列のconcatについて

  • 配列の破壊的結合のメソッド
  • forでループして、一個ずつくっつけてる




⑪pluckについて
  • pluckは指定したカラムの配列を取得するときに使用する
  • 検索に有利
User.pluck(:id)
モデルクラスに使う

正規表現gsub(/...)について
  • 文字列中で 第1引数 にマッチする部分全てを文字列 第2引数 で置き換えた文字列を生成して返す
  • id.gsub(/[^\d]/, ''").to_iでは、記号を除去して、最後に数値型に変換

⑬Model検索時のscope: lambda()について

  • Modelのscopeは「共通のクエリの処理を設定し、それをメソッドのように使えるようにする機能」です
  • scope: xxxx ならば、xxxは検索パターンとしてメソッドで使える
  • lambdaは、無名関数であり、それはrubyのProcオブジェクトである
[lambdaの実例]
# 無名関数(引数を二乗にする関数)
nameless_func = lambda { |n| n**2 }
nameless_func.(5)
# => 25

  • lambda { |捜査対象| オペレーション}をする
  • 実装ではscopeで絞込検索して、idに対してif文でマッチング操作を行っている

uniq.pluckについて
  • ユニークなIDを配列で取得したいときに使う、はやい
  • user_ids = UserCheckin.uniq.pluck(:user_id)

left_joinsについて
  • left_joinsメソッドとは、関連するレコードが有る無しに関わらずレコードのセットを取得してくれるメソッド
  • モデル名.left_joins(:関連名)
16)presenceメソッドについて
  • ActiveSupportの便利なメソッドの一つにpresenceメソッド
  • オブジェクトが存在すればそのオブジェクトを返し、オブジェクトが存在しなければnilを返すメソッド
  • present?よりもすっきりかけることが利点
[実例]
Rubyで例えば以下のようにpresent?メソッドで
object.present? ? object : 'オブジェクト'
のようなのがあればpresenceメソッドでは
object.presence || 'オブジェクト'
とスッキリ書くことができます。
17)?? Oem.where(name: name)について

  • よくわからないから、メモ書きで残しとく

18)generate_accountについて

  • emailからpassword(ランダム)を生成している。
  • Admin.create!(){}という構造は何だろう??
19)モデル図とか

  • あるかな。oem,oen_service,serviceとかで相互関係がよくわからんくなってきた
  • virtual_utmよーわからん

20)to_sym
  • to_symメソッドとは、シンボル(Symbolオブジェクト)を返すメソッドです。
  • Symbolオブジェクトは、:sampleなど : + 文字で表されるものを指し、任意の文字列と一対一に対応するオブジェクトです。
  • .storeメソッドは、hashにKeyとValueをついかすることです


21)Knock_2回目
  • Knockは認証を楽にするgem
  • 認証とは「識別」と「検証」の2ステップで実現されるユーザー特定作業である
  • ApplicationControllerに読み込ませる
  • 他の継承したコントローラーに対して一行埋め込んで実現する
  • リクエストパラメータ(POSTとか)の保護
[実装]
class PostsController < ApplicationController
  include JSONAPI::ActsAsResourceController
  before_action :authenticate_user # この一行を追加
end



22)snakeize_params
[やりたいこと]
Single Page Applicationの開発などでバックエンドAPIサーバとしてRailsを利用する場合、やり取りされる request と response における JSON の keys を camelCase にしつつ、 Rails の内部処理では伝統的な snake_case を使いたい。

  • params.deep_snakeize!



23)エラーの四段階評価

  • ActionController::APIを継承している
  • エラーハンドリングを定義しているapplication_controller
  • rescue_fromで優先度順位を定義している
  • not_found > bad_request > api_error > internal_server_error



24) before_action

  • before_actionは、controllerでのメソッドの共通化に使用する
  • destroyは@xxx.cancel!なんだな
  • Class.find(params[:id])で一意のユーザー特定


              Next Post Previous Post
              No Comment
              Add Comment
              comment url