質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 3.2.0

Ruby on Railsは、Rubyにより構築されたオープンソースのWebアプリケーションフレームワークである。 version 3.2.0は2012年1月2日にリリースされた。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

2980閲覧

YAMLを読み込んでスマートにハッシュの値を取得したい

yuyasat

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 3.2.0

Ruby on Railsは、Rubyにより構築されたオープンソースのWebアプリケーションフレームワークである。 version 3.2.0は2012年1月2日にリリースされた。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2015/11/14 02:01

少し長くなりますが、状況からお話しさせてください。

userモデルとprefecture(県)モデルがあるとします。
user(id, name, prefecture)
prefecture(id, name)
userは一つのprefectureを持ちます。
user <-- prefecture
アソシエーションを正しく設定していれば、
user.prefecture.name
でユーザーのprefectureの名前がとれると思います。
ユーザーの県にあわせて、たとえば「こんばんは」という言葉を表示させるようにしたいとします。

そこで、good_evening.ymlというのを作りました。

Ruby

1# good_evening.yml 2good_evening: 3 aomori: おばんです 4 tokyo: こんばんは 5 kyoto: おしまいやす 6 kagoshima: こんちゃらごあした 7 okinawa: ちゃあびら

@good_evenings = YAML.file_load("#{Rails.root}/good_evening.yml")
のようにしてyamlからとってきます。@good_eveningsにはハッシュ形式で格納されることになります。
このとき、viewで言語を表示させるには、(@userがあるとして)

Ruby

1<%= @good_evenings['good_evening']["#{@user.prefecture.name}"] %> #・・・①

で表示できると思います。もちろん、これでも動きとしては問題はないのですが、
この取得の仕方ををもっとスムーズにすることはできますでしょうか?

たとえば、I18nを使うと、
good_evening.ja.ymlを作って

Ruby

1ja: 2 good_evening: 3 aomori: おばんです 4 tokyo: こんばんは 5 kyoto: おしまいやす 6 kagoshima: こんちゃらごあした 7 okinawa: ちゃあびら

みたいな感じにすれば、

Ruby

1<%= I18n.t("good_evening.#{@user.prefecture.name}") %>

でとれてくると思います。こちらのほうが①よりもきれいな感じはします。
ハッシュの値をこのような感じでスムーズに取得することはできますでしょうか?

しかし、今回私がやりたいのは、どのlocaleでも同じように表示させたいので、I18nは使えません。
jaロケールでもenロケールでも

Ruby

1<%= hoge("good_evening.#{@user.prefecture.name}") %>

とすれば、例えばユーザーが京都なら、「おしまいやす」と表示させるようにしたいです。

条件として、独自のメソッドを作ればできるのは目に見えているので、独自のメソッドではない方法でやりたいです。
それができそうなgemがあればそれでもかまいません。

ruby 2.1.6
Rails 3.2
を使っていますが、Railsのバージョンはあまり気にしなくて大丈夫です。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

挨拶文を DB 登録して、ActieRecord で処理しては如何でしょう。

方針概要案を述べます。

Greeting というモデルを作ます。
greeting(id, prefecture_id, morning, day, night)
// morning には "おはよう"
// day は "こんにちは"
// eveningには "こんばんば"
// night には"おやすみなさい"
// のように設定します。

さらに
user -> prefecture (1 対 1)
prefecture -> greeting (1 対 1)
の関係を持つようにします。(has_one, has_many, belongs_to を使う)
適宜、index も設定しておきます。

こうしておけば
@user.prefecture.greeting.morning
で "おはよう" が得られるとおもいます。

greeting は (id, prefecture, time_zone, message)
// time_zone: morning, day, evening, night ... を設定する。
// message: 挨拶文を設定する。
のようにする案もあります。

48都道府県 * 挨拶の時間区分数なは、それなりの数になるので
メモリーに全部を保持しておくよりは、DB から必要なメッセージだけをとってくるようにしたほうがよい
という理由もあります。
(DB アクセスより メモリーアクセスのほうが速いという意見はありますが、
user, prefecture は DB 管理しているので、greeting を DB にしたからといって
これが原因で劇的に遅くなることはないと予想されます)

この方式をとった場合、将来、 言語対応したくなったときは
i18n の仕組みをつかうのではなく、
DB に 国 の項目を追加して対応することになります。

投稿2015/11/14 03:29

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuyasat

2015/11/14 03:47

回答有難うございます! DBに登録する方法も考えました。 今回、質問ではprefectureという形で質問したのですが、実際は47都道府県ではなく、もっと少ないです。 (仕事の都合上、変えて投稿しました) dbに持たせるほどでもないぐらいのデータ量なのです。 わざわざDBに登録するまでもないちょっとしたデータを持たせる方法というのは、ないものかどうか悩んでいます。
katoy

2015/11/14 05:18

> ... わざわざDBに登録するまでもないちょっとしたデータを持たせる方法... どこかののクラスのクラス変数として配列やハッシュでそのまま ruby コードとして 記述して、 freeze して変更不可にすれば十分では?
yuyasat

2015/11/14 12:34

最初その方法も考えて、ある理由でよろしくないなと思ったんですが、確かに、今改めて思えばその方法がベストの様な気がしてきました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問