俺でもできるもんな

独立系SI企業から完全異業種のベンチャー企業に転職、社内のITインフラを整えるべく颯爽と登場した自称天才プログラマー俺のハートフルブログ

Rails migration decimalカラムをデフォルトで作成すると小数点以下が0桁になるから気をつけよう

decimalをデフォルトで作成すると小数点以下が入力できない

例えば重さを保存するカラムを作る場合はmigrationファイルにこんな感じで書きますよね?

class CreateHoges < ActiveRecord::Migration[5.1]
  def change
    create_table :hoges do |t|
      t.decimal :weight
    end
  end
end

しかし、設定値なしでdecimalカラムを作成する場合

`weight` decimal(10,0) DEFAULT NULL

で作成されてしまうんです。

面倒臭がらずに許容桁数を指定しましょう

桁数の指定optionは以下の通りです。

option value
precision 全体の桁数
scale 小数点以下の桁数

以下のように書いた場合は全体で6桁、小数点以下2桁です。

class CreateHoges < ActiveRecord::Migration[5.1]
  def change
    create_table :hoges do |t|
      t.decimal :weight, precision: 6, scale: 2
    end
  end
end

注意点

  • precisionは全体の桁数です。
  • precisionは整数の桁数ではないです。

Redmine チケットの文中に画像プレビューを載せる裏技

Redmineのチケットに画像プレビューをつけたい時ってありますよね?

Redmineで「こんな感じにお願い!」、「ここ変になってるよ!」などを伝える際に実際のスクリーンショットや写真があったほうが断然わかりやすいのは言うまでもありません。
↓イメージ↓ スクリーンショット 2017-07-29 15.03.22.png

しかし、RedmineにはQiitaみたいに画像プレビューを「ぽんっ」と表示する機能はありません。
※あるかもしれませんが知りません

Redmineチケット上での画像の扱い

ここで画像をアップすると スクリーンショット 2017-07-29 14.39.27.png こんな感じにアップされますね スクリーンショット 2017-07-29 14.42.49.png

チケット内容の説明のために必要な画像だとしたら、
「ここがおかしいので修正よろー(添付画像参照)」
といったように本文を書くことになると思います。

しかし、Redmineのチケット上のファイルアップロード機能はこういう用途ではないのでしょう。
「追加資料です!」とか、「添付画像をファビコンとして使用してください!」とかそういうのに使うんだと思います。

チケット本文中に画像を載せるならURLを指定すればいい

URL指定で画像を載せることができます。 スクリーンショット 2017-07-29 14.51.52.png しかしローカルにある画像ファイルにグローバルなURLなんて存在しません。
なので、先ほどチケットに添付した画像のURLを指定します。 スクリーンショット 2017-07-29 14.52.34.png プレビューはいい感じですね。
しかし添付画像がダサいとても。

つまりグローバルな画像URLが簡単に作れればいい

ここに行き着くと思います。
リモートストレージに設置してそのURLを….ってめんどくさいわ!!!
ということで画像のURLを作る裏技を紹介します。

Qiitaを使う方法

ここに画像をアップします。 スクリーンショット 2017-07-29 15.01.41.png グローバルなURLが作成されます。 スクリーンショット 2017-07-29 15.02.23.png

Githubを使う方法

ここに画像をアップします。 スクリーンショット 2017-07-29 15.05.47.png グローバルなURLが作成されます。 スクリーンショット 2017-07-29 15.06.03.png

作成したURLをRedmineで使う

Qiita or Githubで作成したグローバルのURLを使います。 スクリーンショット 2017-07-29 15.10.30.png プレビューはこんな感じになります。 スクリーンショット 2017-07-29 15.03.22.png

担当者に優しい説明になりましたね^^

注意

  • 今回のQiita、Githubの使い方は両サービスにとって正しい使い方ではありません。
  • くれぐれも自己責任でお願いいたします。
  • QiitaのフローはQiita:Teamで行うと外部サイトから閲覧できない画像になるのでお気をつけて。
  • Githubの無料枠には100MBの制限があります。

Rails 多言語化対応 Model編

はじめに

今後のサービス化していくシステムは多言語化対応が必須となってきます。
なので、多言語化の方針と記述方法を簡単にまとめたので目を通してください。
View編を先に一読ください↓
Rails 多言語化対応 View編

参考サイト

以下のサイトを参考にしました。
記事を読む前に一読お願いします。
モデル名やモデルの属性名の多言語化

実装

dictionary

1つのファイルに全文言をかくと意味不明状態になるので、
参考サイトに倣って然るべき場所に然るべきファイルを作成し文言を記述していきます。
今回はbrandのvalidationで使いたかったので

  • config/locales/models/brands/ja.yml
  • config/locales/models/brands/en.yml

を作成しています。

ja:
  activerecord:
    models:
      brand: ブランド
    attributes:
      brand:
        id: ブランドID
        name: ブランド名
        name_en: ブランド名(英語)
        sellable_jp: Sellable JP
        sellable_us: Sellable US
        brand_category_id: ブランドカテゴリー
en:
  activerecord:
    models:
      brand: Brand
    attributes:
      brand:
        id: Brand ID
        name: Brand Name
        name_en: Brand Name(English)
        sellable_jp: Sellable JP
        sellable_us: Sellable US
        brand_category_id: Brand Category

これ以外にも階層を持った書き方もできたりします。
詳しくは調べてください。

結果

locale = :jaの場合
スクリーンショット 2017-07-27 21.45.16.png

locale = :enの場合
スクリーンショット 2017-07-27 21.45.29.png

補足

「を入力してください」の部分はvalidatesを使えば自動で変換されます。

Rails 多言語化対応 View編

はじめに

このグローバル社会!
開発するサービスによっては多言語化対応が必要になりますよね?
今回自社の開発で多言語化対応をしたので簡単ではありますが導入を紹介します。

View編を先に一読ください↓
Rails 多言語化対応 View編

参考サイト

以下のサイトを参考にしました。
記事を読む前に一読お願いします。

before_action以外

i18nについて
特にこの2つ
i18nのベーシックな使い方
辞書ファイルを分割して管理をしやすくする

before_action

Ruby on Railsで言語切り替え機能を作る

実装

config

config/application.rbにデフォルトの言語と複数のロケールファイルを読み込む設定を記述します。

config/application.rb

module TestProject
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
  end
end

before_action

controller/application_controller.rbにbefore_actionとして、localeの指定があった場合変更する処理を書きます。
ログイン情報と一緒にlocale情報を持っておいてページを読み込むたびにチェックするイメージです。

controller/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  
  before_action :set_locale

  def set_locale
    I18n.locale = locale
  end

  def locale
    # ここで言語の切り替えを行う
    @locale ||= params[:locale] || I18n.default_locale
  end
end

dictionary

1つのファイルに全文言をかくと意味不明状態になるので、
参考サイトに倣って然るべき場所に然るべきファイルを作成し文言を記述していきます。
今回はbrandのviewで使いたかったので

  • config/locales/views/brands/ja.yml
  • config/locales/views/brands/en.yml

を作成しています。

config/locales/views/brands/ja.yml

ja:
  brand_index_title: "ブランド一覧"

config/locales/views/brands/en.yml

en:
  brand_index_title: "Brand List"

これ以外にも階層を持った書き方もできたりします。
詳しくは調べてください。

view

書き方はいろいろありますが、階層を持たない場合はこれで統一してください。
(この例にはslimを使用しています)

view/brands/index.rb

h1 = t(:brand_index_title)

結果

locale = :jaの場合 a552ecf6-da35-7015-cacd-c512c6dee036.png

locale = :enの場合 aa1e6ef6-fc11-a1fe-5b8e-3eca219de7bf.png

補足

今回はviewでの利用方法でしたが、modelでも利用することになります。
(validのエラーメッセージで使うはず)

Git 間違ってaddしてしまったものを取り消す方法

はじめに

軽快にaddしていた時に間違ってaddする必要もないものをaddしてしまった経験はないでしょうか?

$ git add -p

「y」、「Enter」、「y」、「Enter」、「y」、「Enter」….あっ(察し) 僕はよくあります。

そんな時にaddを取り消す方法を共有します。

コマンド

コマンドは実にシンプルです。

$ git reset HEAD config/database.yml

以上です。

Rails kaminariを使用したページネーションにBootstrapデザインを適用させる

前提環境

  • RoRプロジェクト
  • プロジェクトにBootstrapの環境が整っている
  • プロジェクトにkaminariでページネーションが生成できる環境が整っている

kaminariを用いたページネーションのソースはとてもシンプル

<%= paginate @pagination %>

このどこにBootstrapを適用させる余地があるんだ…と頭を2秒ほど抱えた。

kaminariにBootstrapを適用させる

Bootstrap用のViewテンプレートをジェネレートする

rails g kaminari:views bootstrap3
Running via Spring preloader in process 68165
      downloading app/views/kaminari/_first_page.html.erb from kaminari_themes...
      create  app/views/kaminari/_first_page.html.erb
      downloading app/views/kaminari/_gap.html.erb from kaminari_themes...
      create  app/views/kaminari/_gap.html.erb
      downloading app/views/kaminari/_last_page.html.erb from kaminari_themes...
      create  app/views/kaminari/_last_page.html.erb
      downloading app/views/kaminari/_next_page.html.erb from kaminari_themes...
      create  app/views/kaminari/_next_page.html.erb
      downloading app/views/kaminari/_page.html.erb from kaminari_themes...
      create  app/views/kaminari/_page.html.erb
      downloading app/views/kaminari/_paginator.html.erb from kaminari_themes...
      create  app/views/kaminari/_paginator.html.erb
      downloading app/views/kaminari/_prev_page.html.erb from kaminari_themes...
      create  app/views/kaminari/_prev_page.html.erb

テンプレートが作成される。

スクリーンショット 2017-07-12 16.16.47.png

これだけ

スクリーンショット 2017-07-12 16.18.24.png

一瞬で適用できた。

懸念点

逆にこのページだけBootstrapのデザイン使いたくないとなった時の対処方法が今の所わからない…

参考サイト

http://morizyun.github.io/blog/kaminari-gem-paginator-rails/

Rails MySQLを使用するアプリケーションでMSSQLServreにも接続する

カオスじゃないかこれは

前提条件

  • 新アプリケーションではRails + MySQLを使用する。
  • 既存のアプリケーションはSQLServreを使用している。
  • SQLServreはWindowsServerに配置されている。

実現したいこと

新アプリケーションで登録があった場合、 新アプリケーションDB・既存アプリケーションDB共に更新する。

実装

SQLServerを使うためのgemを導入する

# SQLServer用
gem 'tiny_tds'
gem 'activerecord-sqlserver-adapter'

そしていつもの

$ bundle install

しかしこれはエラーとなる。 tiny_tdsを使用するにはFreeTDSが必要。

$ brew install freetds
# または
$ yum install freetds freetds-devel

そのあとに

$ bundle install

これでgemの導入は完了。

SQLServreの情報をセット

database.ymlにSQLServreの情報をセットする。

# ここら辺はMySQL用の設定
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: [username]
  password: [password]
  host: [host]

development:
  <<: *default
  database: management_development

test:
  <<: *default
  database: management_test

production:
  <<: *default
  database: management_production
  username: management
  password: <%= ENV['DATABASE_PASSWORD'] %>
# 以下を追加
# MSSQLサーバー用
sqlserver:
  adapter: sqlserver
  host: [host]
  database: [database]
  port: [port]
  username: [username]
  password: [password]

Modelの作成

SQLを実行するだけの機能を実装。 ApplicationRecordは継承しない。

# MSSQLServerにつなぐもの
class Msss
  # SQL文を実行する
  def self.exec(sql)
    sscnf = Rails.configuration.database_configuration['sqlserver']
    client = TinyTds::Client.new(
      adapter: sscnf['adapter'],
      host: sscnf['host'],
      database: sscnf['database'],
      port: sscnf['port'],
      username: sscnf['username'],
      password: sscnf['password']
    )
    client.execute(sql)
  end
end

使用例

単純なSELECT文を実行し、その結果を取得する例

class TestController < ApplicationController
    def test
        result = Msss.exec("SELECT * FROM [list] ")
        result.each do |row|
            puts row["name"]
        end
        render :text => "text"
    end
end

もちろんUPDATEやINSERTも可能。

参考にさせていただいたサイト

Rails3でSQLServerに接続してみたよ [Rails][AzureSQLデータベース]Macでtiny_tdsのbundle installが通らない時の対処法