Rails Form Builder 的 label for radio button 的 locales 文件该如何写

weiwei5987 · 2015年08月07日 · 最后由 yangman_wenzhu 回复于 2015年10月22日 · 2407 次阅读

在 form 中,如果是 text_field,那么视图文件可以像下面这么写:

<div class="field">
    <%= f.label :amounts %><br>
    <%= f.text_field :amounts %>
</div>

对应的 locales 文件呢,可以如下写:

helpers:
    label:
      account_record:
        amounts: "金额"

但是如果是 radio button,视图文件得写成这样:

<div class="field">
    <%= f.radio_button :incoming_or_outgoing, 'incoming', :checked => true %>
    <%= f.label :incoming_or_outgoing, I18n.t(:incoming), :value => 'incoming' %>
    <%= f.radio_button :incoming_or_outgoing, 'outgoing' %>
    <%= f.label :incoming_or_outgoing, I18n.t(:outgoing), :value => 'outgoing' %>
</div>

对应的 locals 文件没法把 incoming 和 outgoing 放在 Model 下面了。。。

请问该如何解决呢?谢谢回答。

1 楼 已删除

请问楼主 只是要一个解决方法吗? i18n 用 full path 行不?

I18n.t("helper.label.account_record.incoming")

#2 楼 @flemon 谢谢回答,这样刚才试了一下没成功。是不是 I18n 没有这种 radio button 等组件的国际化呢?

#1 楼 @weiwei5987 好像不应该说是 I18n,应该是 form builder 的

楼主怎么试的?发个代码看看,因为我觉得这个跟 radio button 没什么关系的,除非你用t()而不是I18n.t,因为 view 下得t()有个默认路径

6 楼 已删除

#5 楼 @flemon 不好意思,是我写的不对,给你添麻烦了。 full path 行得通,但是和前面的 label 不一样的是,radio button 的两个 label 都是 for :incoming_or_outgoing,但是要显示的文字不一样,想必你在开发中也遇到过同样的问题,form build 能自动为两个 label 生成不同的显示文字么?谢谢。

我的理解是应该可以的

f.label :incoming_or_outgoing, I18n.t("xx.xx.incoming_or_outgoing") #这是这个radio box选项的label
f.label :incoming_or_outgoing, I18n.t("xx.xx.incoming"), value: "incoming" #这是选项"incoming"的label
f.label :incoming_or_outgoing, I18n.t("xx.xx.outgoing"), value: "outgoing" #这是选项"outgoing"的label

但是因为没有亲自调试,要是我理解错了,请告知

#8 楼 @flemon 你是对的,这样就是可行的,就是觉得没普通的 label 那样不用写 full path 那么自然

总会有点美中不足的。。。 如果是我的话,我会用t()而不是I18n.t(),路径是跟文件路径一致的,例如在app/views/account_records/_form.html.erb里使用代码<%= t(".radio_label.incoming") %>会寻找 yaml 路径account_records.index.form.radio_label.incoming

具体请看文档4.1.4 "Lazy" Lookup

在 app/config/locales/ 建立 views 文件夹 在建立一个 users/en.yml && zh-CN.yml application.rb 配置:config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
然后前端使用t('users.incoming')

需要 登录 后方可回复, 如果你还没有账号请 注册新账号