いてづきブログ

情シスでやってみたことの備忘録

railsにslimを導入するためにしたこと

railsのviewをslimで書くためにやったこと。

slim-railsの導入

Gemfileにslimを入れてbundle install。既存のerbを変換するためにhtml2slimも同時に入れる。

gem 'slim-rails'

group :development do
  gem 'html2slim'
end

erb2slimを実行しようとしたが…

既存のerbをslimにしようとerb2slimを実行したが、erb内で日本語文字を使用していたためエラー。

invalid byte sequence in US-ASCII (ArgumentError)

変換のときだけ日本語文字を省いてもいいが、同様の問題は今後も発生する可能性があるのでなるべくソース内に日本語文字を直書きしないようにするべくI18nを導入*1

railsguides.jp

I18nを導入

Gemを追加。

gem 'rails-i18n'

confg/application.rbでデフォルトのlocaleを指定。

config.i18n.default_locale = :ja

config/locale配下にymlを配置(view.ja.yml)

ja:
  users:
    index:
      name: 氏名

erb内からymlで指定した表記を呼び出す。

<%= I18n.t('.users.index.name') %>
#=> 氏名

erb2slimを再実行

改めてerbをslimに変換する。-dオプションは変換後に元のerbを削除するオプション。

bundle exec erb2slim app/views -d

変換後、上記のerb部分もきちんと変換された。

= I18n.t('.users.index.name')

まとめ

単にslimを入れるだけのはずがなぜか結構大仕事になっていた。 仕事で使ってるプロジェクトが、日本語しか使わないのにI18n使っててなんでなのかなぁと思ったけどこういう理由もあったりしたのかな。わからん。。。

*1:本来の目的ではないが勉強も兼ねて

rbenvで最新版のrubyがインストール出来ないとき

rbenvで最新版のrubyをインストールしようとした

rbenv install 2.6.1 && rbenv global 2.6.1


すると、エラーが出た。

ruby-build: definition not found: 2.6.1
See all available versions with `rbenv install --list'.

If the version you need is missing, try upgrading ruby-build:
  brew update && brew upgrade ruby-build

「2.6.1なんてねーよ」というエラー。 メッセージの通りrbenv install --listを実行してもリストに2.6.1がない。

なので、その下のメッセージに沿ってruby-buildをupdateする。

brew update && brew upgrade ruby-build

アップデートが終わったら再度rbenv install --listを確認して2.6.1があることを確認したので あらためてインストールとバージョンの確認。

# 2.6.1をインストール
rbenv install 2.6.1 && rbenv global 2.6.1
# 設定結果を確認
rbenv versions

Modelのアップデートでカラムを動的に変える

Railsの処理の中で、更新するカラムを動的に変えたい場合の書き方。
公式ドキュメント読んでもよくわからなかった(書いてなかった)のでメモ。

userhogeもしくはmogeのどっちかをfugaに更新したい場合、下記のように書く。

field = user.condition? ? :hoge : :moge
user.update(field => 'fuga')


メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

clasp事始め

claspのインストールからpushできるようになるまで

ドキュメント&公式リポジトリ

github.com

インストール

公式ドキュメントに沿ってインストールを試みる

sudo npm i @google/clasp -g

するといきなりエラーが出てつまづく

...
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall rename
npm ERR! enoent ENOENT: no such file or directory, ...

READMEの下の方にトラブルシューティングがあるのでそれを読む。 Node version >= 6.0.0.とのことなので、トラブルシューティングに沿ってnodeのアップデートをする。

node -v # Check Node version
sudo npm install n -g
sudo n latest

アップデート後、再度インストールコマンドを実行することでclaspのインストールができた。

clasp -v
> 1.7.0

プロジェクト作成

既存のGASプロジェクトと紐付けることもできるみたいだけどまずはclaspでプロジェクトを作成してみる

clasp create


作成するプロジェクトのタイプを選択させられるのでとりあえずstandaloneを選択。 するとまたエラー。

User has not enabled the Apps Script API. 
Enable it by visiting https://script.google.com/home/usersettings then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.


AppsScriptAPIをオンにしろと言われているので指示に従ってhttps://script.google.com/home/usersettingsにアクセスしてAPIをオンにして再度プロジェクトを作成する。

.clasp.jsonappsscript.jsonが作成された。 なぜかappsscript.jsonのtimezoneが"America/New_York"になっているがとりあえず気にしないことにする。

コードを書いて反映させる

この時点で既にGoogleドライブ上にGASプロジェクトは作られているみたい(?)
clasp pullすると空のmyFunctionが入ったCode.jsがダウンロードされてくる。

とりあえずログを出せるように書いてpushしてみる。

function myFunction() {
  Logger.log("hoge")
}


clasp openするとブラウザでGASのエディタが開き、ローカルで書いたコードが反映されていることがわかる。

次の課題

clasp runできない問題

clasp runしてローカルで実行しようとしたら認証スコープ定義しろみたいなエラーが出て実行できなかった。

Error: Local client credentials unauthenticated. Check scopes/authorization.

Logger.logしか書いてないので認証するところないと思うんだけど(ブラウザのGASエディタでは認証ダイアログも開かず問題なく実行できた)

ES6で書けるようにする

とりあえずES6で適当に書いてpushしたら書いたものがそのまま上がってしまって実行できなかったので(GASはES6記法未対応)何らか変換する部分は自分で用意する必要があるっぽい。

現時点だとローカルでGit管理できるということ以外一切のメリットがないのでもう少し環境整備する必要がある。

とりあえず今日はここまで

Going GAS: From VBA to Google Apps Script (English Edition)

Going GAS: From VBA to Google Apps Script (English Edition)

ぼっち演算子

ある日時フィールドstartについて、現在時刻より前かどうかを判定する必要があったが、そのフィールドがnilになる場合がある。


とりあえず正直に書いてみた。

def past?
  if start.present?
    start < Time.current
  else
    false
  end
end

これでプルリク出したらレビューでstart&.< Time.currentで書けるよと教えてもらった。

これはぼっち演算子と言われるもので「xxx が nil でないときにメソッドyyyを呼び出す」とのこと。
Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 2.5.0)

一応の注意点としてぼっち演算子で書いた場合、startがnilだとstart&.< Time.currentの返り値はfalseではなくnilになる。
しかし、Rubyは「false」と「nil」だけが false であとは全部 trueなので基本的には問題はなさそう。

冗長なコードが短くなってスッキリ。

def past?
  start&.< Time.current
end