Category Archives: Ruby

メソッド 値引き渡し

コード

def process1(records)
  records.each do |record|
    record.store("name", "hello")
  end
end

records = [{:age=>35}]
process1(records)
p records

def process2(records)
  records_2 = []
  records.each do |record|
    record_2 = record.clone
    record_2.store("name", "hello")
    records_2 << record_2
  end
end

records = [{:age=>35}]
process2(records)
p records

結果

// process1の場合、引数のrecordsが編集される
[{:age=>35, "name"=>"hello"}]

// process2の場合は、引数が編集されることはない
[{:age=>35}]

zendesk api

postmanで接続確認

Authorization

Basic Auth
* username
* password

url

エンドポイント

// post
https://dev-air-payment.zendesk.com/api/v2/tickets.json

body

{"ticket" : {"subject" : "hello", "description" : "テスト"}}

コード

address = URI("https://dev-air-payment.zendesk.com/api/v2/tickets.json")
http = Net::HTTP.new(address.host, address.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new address.request_uri

// 方法1
request.basic_auth("{id}", "{pass(APIトークン)}")
request.add_field("Content-Type", "application/json")

// 方法2 base64エンコードする
bearer_token = "{id}/token:{pass(APIトークン)}"
encoded_bearer_token = Base64.strict_encode64(bearer_token)
request.add_field("Authorization", "Basic #{encoded_bearer_token}")

body = {
  "ticket" => {"subject" => "hello", "description" => "test!"}
}.to_json
request.body = body
response = http.request(request)

elastic beantalk rubyの単純なアプリケーションデプロイ

初期設定

// 基本設定 (ssh用のkeyも作成しておく。.ssh配下に配置される。)
eb init

// レポジトリ作成 (sinatraapp-devレポジトリが作成される)
eb create sinatraapp-dev --sample

// ページ確認
eb open

// ファイルを追加してコミット
eb deploy

// 再度デプロイされたページを確認
eb open

// ssh接続 .ssh配下に配置してあるkeyを自動で読みに行ってssh接続してくれる
eb ssh {レポジトリ名}

参考

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_Ruby_sinatra.html

indexとprimary key

通常

マイグレーションファイル

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :code
      t.timestamps
    end
    // unique設定、index設定
    add_index :users, :code, :unique => true
  end
end

テーブル定義

idがprimary keyになる。このままだと、codeカラムはnullを許容する。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `code` varchar(255) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_users_on_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

codeにnot null制約を追加

マイグレーションファイル

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :code, null: false // not null制約を追加
      t.timestamps
    end
    add_index :users, :code, :unique => true
  end
end

テーブル定義

not null 制約が追加されている

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `code` varchar(255) NOT NULL, // not null制約が追加されている
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_users_on_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

slack rails連携

Slack管理画面

  1. manage/custom-integrations に遷移
  2. Incoming WebHooks を新規登録。
  3. Botアカウント及びチャンネルを作成
  4. Webhook URLを控える

Rails

// slack_url, slack_pathは、上記で控えたもの
class SlackClient
  def self.send(message_text)
    client = Faraday.new(:url => ENV["SLACK_URL"]) do |conn|
      conn.adapter Faraday.default_adapter
    end

    res = client.post do |request|
    request.url ENV["SLACK_PATH"]
    request.headers = {
      w'Content-type' => 'application/json',
    }
    request.body = {"text" => message_text}.to_json
    end
  end
end

rails secret_key_base

設定

secret_key_baseは、レポジトリ内にコミットしない。
以下の方法で本番サーバーで直接設定する

production server

$bundle exec rake secret
ランダム文字列

$SECRET_KEY_BASE=ランダム文字列
$export SECRET_KEY_BASE
$env | grep SECRET_KEY_BASE
SECRET_KEY_BASE=ランダム文字列

config/environments/production.rb

// 以下を追記
config.serve_static_assets = true  

参考

http://qiita.com/a_ishidaaa/items/74de8bdaecd637063c40

アソシエーション(既存カラムを外部キーに)

以下のように設定

クラス定義

class One < ApplicationRecord
  // 対象のカラムにプライマリーキーが設定されていない場合は、primary_key: '加盟店番号' といったように設定が必要
  has_one :monitoring, class_name: 'OneMonitoring', foreign_key: '加盟店番号', primary_key: '加盟店番号'

class OneMonitoring < ApplicationRecord
  belongs_to :one, foreign_key: '加盟店番号', primary_key: '加盟店番号'

active record where 複数テーブル結合

前提

// リレーション関係
class PayTransactionMonitoring < ApplicationRecord
  belongs_to :pay_transaction

方法1

// PayTransactionMonitoringインスタンスで取得できる
pay_transaction_monitorings = PayTransactionMonitoring.joins(:pay_transaction).where('pay_transactions.VM加盟店番号 = "045014348092"')

// belongs_toの関係にあるPayTransactionインスタンスも取得できる
pay_transaction_monitorings.first.pay_transaction

方法2

似たような書き方。方法1の方が簡潔でわかりやすい。

// PayTransactionMonitoringインスタンスで取得できる
pay_transaction_monitorings = PayTransactionMonitoring.joins(:pay_transaction).merge(PayTransaction.where(加盟店番号: "123"))

// belongs_toの関係にあるPayTransactionインスタンスも取得できる
pay_transaction_monitorings.first.pay_transaction

参考

http://qiita.com/merrill/items/de6eb7e899753ad3361a