なんとなく日々徒然と

Rails 便利なテクニック その1

日常コード書いてて便利だなぁと思った技とかを思い出したら不定期に書いていきます。

よくメニューをulとliを使ってタブで表示することがあると思います。
例えばタブは以下の条件で表示されます

  • ユーザの年齢が20歳以上なら表示するタブA
  • ユーザの性別が男性なら表示するタブB
  • ユーザの性別が女性なら表示するタブC
  • ユーザの性別が男性でかつ20歳以上なら表示するタブD

実装が終わって総合テストがはじまります。

ここでチケットがあがってきます。

『タブが一つしか出力されない場合はタブを非表示にしてください。』

さてどうしましょう?

Cronがutcで動いてる場合に

Centosでtimezoneの設定が日本時間にしているのにcronが指定時刻に動かず調べました。
/var/log/cronを見るとログの時間が-9時間。
JSTで動いてないっぽいです。

以下のコマンドでcronのログの時刻も含めて治ります。

RailsConfig(現Config)で読み込んでいるファイルのパスを得る

内部的にrails_envを書き換えたりしていて、rails_configの値がただしくRAILS_ENVの設定通りにファイルを読み込んでくれない事象が発生したので。

rails_config (0.4.2)

1
2
irb(main):014:0> Settings.instance_variable_get(:@config_sources)
=> [#<RailsConfig::Sources::YAMLSource:0x0055a28d40ab48 @path="Rails_rootへのパス/current/config/settings.yml">, #<RailsConfig::Sources::YAMLSource:0x0055a28d40aa30 @path="Rails_rootへのパス/current/config/settings/hoge.yml">, #<RailsConfig::Sources::YAMLSource:0x0055a28d40a9e0 @path="Rails_rootへのパス/current/config/environments/hoge.yml">]

jpmobileでPCでスマートフォンのビューを表示する場合

なんらかの条件で強制的にスマートフォンのviewを使いたい時。 アプリのwebviewとか?

1
2
3
4
5
6
7
before_filter :hoge
def hoge
  if true # 条件
    env["rack.jpmobile"] = Jpmobile::Mobile::SmartPhone.new(env, request)
    register_mobile
  end
end

Go言語を使ってローカルマシン上でbotを動かしSlackでtodo管理をする

前回の続編です。

Go言語を使ってローカルマシンに簡易botを作ってSlackに投稿

botを使ったtodo機能をslackに付与するべくgoのコードを書いてみました。

todo コマンド {{追加削除の場合はテキスト}}

という感じでつぶやくと、

チャンネル毎にtodoリストが管理できるようにしたいと思います。
dbがなくても動くようにファイルに保存します。

操作 コマンド
追加 add 追加したいテキスト
削除 del 削除したいテキスト
一覧 list
全削除 clear

こんな感じで動きます。

todobot

便利そうですね!

i18nで例えば大人と子供で文言を変えたい場合

条件に応じて文言を変えたい場合があると思います。
例えば大人と子供で文言を変えたい場合とかですかね。
ログインユーザが大人の場合は大人料金と表示し、子供の場合は子供料金と表示するようにします。

1
2
3
4
5
<% if current_user.adult? %>
  <span>大人料金</span>
<% else %>
  <span>子供料金</span>
<% end %>

これが一箇所ならいいですが、たくさん出現するとつらいですね。
helperにまとめたりするのでしょうか。
こういった文言だけのif文分岐がviewに大量に出現するとコード量も増え非常に見ずらく、またhelperに乱立してしまうのは避けたいですね。

そこで自動でi18nの読み込み先を条件に応じて読み替えたいと思います

ついでにjpmobile使用してviewをpcとスマフォで切り替えている場合に
lazy lookup記法時にスマフォページでsmart_phoneがついているlocaleを探してしまうのを防ぎます。

FaradayとHttpartyでクッキーを付与したい場合

同一ドメインなんだけどホスト名が違うシステムがあり、WEBサーバーからApiサーバーへjsonを取得するべくgetリクエストを投げる。
その際にWEBサーバーでログイン時に発行されたクッキーをリクエストに付与してapiサーバーではそのクッキーからユーザを特定するような処理が必要になった。

FaradayとHttpartyでクッキーを付与する方法を調べた。

Go言語を使ってローカルマシンに簡易botを作ってSlackに投稿

Goを勉強がてら使いながら簡易slackbotを作ってみました。
slackにデフォルトで用意されているslackbotってお願いしますをキーに登録すると、「お願いします] とか「お願いします。」(句読点入り)は反応してくれるけど。 「よろしくお願いします。」みたいに単語をつなげると反応してくれない。

単純に単語が含まれるかだけで反応してくれればいいのに・・・

ということもありお手製slackbotをつくってみました。
自分のPCでプログラムを動かし、slackで投稿があった際にはOutgoing WebHooksで投稿内容を取得してBotとして返信したいと思います。

slack → ローカルmacのbot → slack

の流れです。