GYAOの窓際エンジニア 玉利です。
弊社、いままで独自のログオンシステムをつかっており、ActiveDirectoryに関するノウハウがありません。こんなADがらみの仕事をしているのは社内システムの人だけなので、製品開発側の組織の私は毎回地雷を踏むのがお仕事です。
今週は、ちょうどベトナムで作業してました。日本側のユーザーインタビューは日本にいるベテランNさんにお任せです。
私「Nさん、今度のシステム、名前は社内のログイン名でいいですよねー」
Nさん「今使ってる入稿のほうもログイン名だから、いいんじゃないっすかー?」
私「りょーかいっす、前例どおりで」
半日後
Nさん「やっぱり、企画サイドから名前を日本語にしてと言われてしまいました」
私「えー、めんどくさい。。。。言う方は簡単だけどさ。。。。社内的にだれもやってないじゃん」
仕方ないので、資料をあたってみました。コードを製造するのはベトナム人なので、やりかたをこちらであたりを付けてあげるのが私の仕事です。自分で書いたほうが早いとか言ったら、その担当者はインドかベトナム送りにしてあげます。
Deviseだったら日本語名は結構簡単
調べていたら、DisplayNameというパラメーターに日本語の名前が格納されている感じがしました。弊社だけでなくて他所の会社もたぶんここにお名前を入れてるのではないでしょうか?
チケットをこんなふうに書きました。
**[Add] Please show User's JapaneseName(DisplayName) ユーザの日本語化対応**
Please add User.display_name column.
We will add/store Japanese name here
We try to get ActiveDirectory's DisplayName and set here
https://github.com/cschiewek/devise_ldap_authenticatable
DeviseでLDAP:DisplayNameを拾う
出てきたコードがこちらです。
# User Model
class User < ActiveRecord::Base
before_save :ldap_email, :ldap_display_name
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :ldap_authenticatable, :registerable,
:recoverable, :rememberable, :trackable # , :validatable
#中略
private
def ldap_email
ldap_email = Devise::LDAP::Adapter.get_ldap_param(username, 'mail')
self.email = ldap_email.first unless ldap_email.nil?
end
def ldap_display_name
ldap_display_name = Devise::LDAP::Adapter.get_ldap_param(username, 'displayname')
self.display_name = ldap_display_name.first.force_encoding('UTF-8') unless ldap_display_name.nil?
end
end
これで、User.display_nameに日本語の社員名が自動で拾えるようになりました。Railsで業務アプリを作ってる例ってあんまり出てないと思うので、皆様のお役にたてればと思います。
このコードとI18Nの仕組みがあれば、海外オフショアでも普通に日本語ビジネスアプリの開発ができますね。