2016-09-09 9 views
0

これはおそらく前に頼まれましたが、私は列を持つテーブルからデータを取得しようとすると、2つのエンロケールおよびJAレール方式は

と国際化を使用しています。この

上の任意の情報を見つけることができませんtitle_ja title_jaのように。したがって、ロケールが表示されているときにtitle_enを表示する必要があります

これはRubyで簡単に実行できますか?

私はヘルパーを使用しようとしています:

module WorksHelper 
    def col_lang(col) 
     if (locale == :ja) 
      lang = "_ja" 
     else 
      lang = "_en" 
     end 
     return col+lang 
    end 
end 

そして私は、ビューでこれをコールする方法を考え出す傾けます。私はこれを試しています:

<%= work.(col_lang("title")) %> 

明らかにこれは間違っています。 Rubyはundefined method callと言っています。ここで関数をどのように呼び出すのですか?

+1

ビューヘルパーは、例えば、 '<%= col_lang( "言語" %>'、直接利用可能な機能*は* '"#{COL}#{ロケール=のように書くことができ –

+0

@DaveNewton私はちょうどウェブサイトの何かのためにこれを使用しましたが、 – JapanGuy

答えて

3

変更ビュー内の行へ:

<%= work.send(col_lang("title")) %> 

それとも(IMO読みやすくなるため)にヘルパーを変更します。

module WorksHelper 
    def localized_attribute(instance, attribute) 
    suffix = (locale == :ja) ? 'ja' : 'en' 
    instance.send("#{attribute}_#{suffix}") 
    end 
end 

と同様に、あなたのビューでそれを呼び出しますこれは:

<%= localized_attribute(work, :title) %> 
+0

ありがとう!私は答えとしてこれを選択することができます前に待つ必要があります、ありがとう! – JapanGuy

2

もう1つの方法は、モデル:

class Work < ApplicationRecord 
    # ... 

    def title(locale = I18n.locale) 
    public_send(:"title_#{locale}") 
    end 
end 

を介してそれを呼び出す:

<%= work.title %> 

または、明示的にロケールを指定するには:

<%= work.title(:ja) %> 
1

効果的に、あなたが何をしようとしていることは、モデルのを取得することですシンボル表現ではなく、その名前を含む文字列で属性を指定します。

This is how you do that.

spickermannの答えが推奨するようsendも、あなたがそれを実現することなくdestroyコマンドを送信できるようになるので、理想的には、あなたは、sendを使用しないでください。理想的ではない。代わりにread_attributeを使用してみてください:。

module WorksHelper 
    def localized_attribute(instance, attribute) 
    suffix = (locale == :ja) ? 'ja' : 'en' 
    instance.read_attribute("#{attribute}_#{suffix}") 
    end 
end