8/25-調べ
■index
■
■
①ActiveRecord::RecordInvalidについて
■
- ActiveRecord::RecordInvalidについて
- unless response.code === 200 について
- %#06dについて
- webmockについて
- rest-clientについて
- ActiveSupport::Concernモジュール
- verify_ssl: Open::SSL::VERYFY_NONEについて
- paginate_perで配列に対するページャー
- class << selfについて
- 配列のconcatについて
- pluckについて
- 正規表現gsub(/...)について
- Model検索時のscope: lambda()について
- uniq.pluckについて
- left_joinsについて
- presenceメソッドについて
- ?? Oem.where(name: name)
- generate_accountについて
- モデル図とか
- to_sym
- Knock(2回目)
- snakeize_params
- エラーの4段評価
- before_action
■
■
①ActiveRecord::RecordInvalidについて
- Active Recordのバリデーション (検証: validation) 機能
- オブジェクトがデータベースに保存される前にオブジェクトの状態を検証する方法
- invalidは無効状態
■
②unless response.code === 200
■
②unless response.code === 200
- if / unless で条件分岐
- unless === xxx は、正解を一つだけにして、それ以外を許容しないハンドル
■
③%#06dについて
■
③%#06dについて
- ゼロパディング処理をしている
- 6桁にして、隙間を前00で埋める処理
- format("#{abc}%#06d",some_id)
■
④webmockについて
②APIのアクセス許可
■
④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について
⑤rest-clientについて
- 非オープンサービスのAPIを使うとき、APIクライアントが無いことが多い
- なので、アプリケーションから使いたいAPIだけを叩くような簡易なAPIクライアントを自分で書く。
- そのときはrest-clientあたりを使ってベタっと書いてしまうことがほとんど
■
■
⑥ActiveSupport::Concernモジュール
■
■
■
⑩配列のconcatについて
■
⑥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について
■
■
⑧paginate_perでのページネーション⑦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, )
■
■
- ページネーション機能を提供するGem
[実装]
- Models に pagenates_for = 10と登録
- Controllerに @items = Item.page(params[:page])とする
- Viewでレンダリングする
- Customer.pageに入っている
■
■
⑨class << selfについて
- クラスメソッドの定義方法のイディオム
- クラスメソッドの定義方法は二つあるけど、記述が少ないほうのやつ
[イディオム]
# 特異クラスによるクラスメソッドの定義例 class Foo class << self def a_class_method end def another_class_method # 二つ定義しても self つけなくていいから便利! end end end
■
⑩配列のconcatについて
- 配列の破壊的結合のメソッド
- forでループして、一個ずつくっつけてる
■
■
⑪pluckについて
[lambdaの実例]
⑪pluckについて
- 文字列中で 第1引数 にマッチする部分全てを文字列 第2引数 で置き換えた文字列を生成して返す
- id.gsub(/[^\d]/, ''").to_iでは、記号を除去して、最後に数値型に変換
■
■
⑬Model検索時のscope: lambda()について
- Modelのscopeは「共通のクエリの処理を設定し、それをメソッドのように使えるようにする機能」です
- scope: xxxx ならば、xxxは検索パターンとしてメソッドで使える
- lambdaは、無名関数であり、それはrubyのProcオブジェクトである
# 無名関数(引数を二乗にする関数) | |
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 を使いたい。
■
[やりたいこと]
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])で一意のユーザー特定