読者です 読者をやめる 読者になる 読者になる

備忘録のような何か

何か += 備忘録( 日々のこと, 妄想, IT, DIY, 畑仕事 );

【開発日誌/Ruby】f.submitのラベルを動的に切り替えたい

IT プログラミング Ruby

scaffoldで自動生成された_form.html.erbでsubmitボタンは

<%= form_for(@book) do |f| %>
  〜 略 〜
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

のようになっていますよね。

このボタンのラベルって
new.html.erbから呼ばれたときには「create 〜」
edit.html.erbから呼ばれたときには「update 〜」
という感じで設定されているけど、どこで設定してるんだろう?

プロジェクト配下のファイルをGrepしてみてもそれらしい記述がみつからない。。。

固定の値に変えるだけだったら

<%= f.submit "登録" %>

のようにすればいいけど、「登録」「更新」のように動的に設定したいんです。

locales/en.ymlに定義したらいける? → stack overflow
<%= render 'form' %>するときにラベル名渡すほうが簡単かな? → stack overflow

やり方はいろいろあるけど、そもそもの作りはどうなってるんだー!?

みんな気にしないのか、常識なのか、、、
あまり情報が転がってないので、直接ソースを見てみます。

GitHub

# Add the submit button for the given form. When no value is given, it checks
# if the object is a new resource or not to create the proper label:
#
#   <%= form_for @post do |f| %>
#     <%= f.submit %>
#   <% end %>
#
# In the example above, if @post is a new record, it will use "Create Post" as
# submit button label, otherwise, it uses "Update Post".
#
# Those labels can be customized using I18n, under the helpers.submit key and accept
# the %{model} as translation interpolation:
#
#   en:
#     helpers:
#       submit:
#         create: "Create a %{model}"
#         update: "Confirm changes to %{model}"
#
# It also searches for a key specific for the given object:
#
#   en:
#     helpers:
#       submit:
#         post:
#           create: "Add %{model}"
#
def submit(value=nil, options={})
  value, options = nil, value if value.is_a?(Hash)
  value ||= submit_default_value
  @template.submit_tag(value, options)
end

「In the example above, if @post is a new record, it will use "Create Post" as submit button label, otherwise, it uses "Update Post".」
なるほど。。。

そして、やはりstack overflowで見つけたように、
en.ymlで上書きするのが正しいやり方っぽいですね。
今作ってるアプリでは前回、default_localの設定をjaにしたので、ja.ymlに書くことにします!

(config/locales/ja.yml)

ja:
  helpers:
    submit:
      create: "登録する"
      update: "更新する"


f:id:m_uta:20160211110933j:plain:w450

でけた(`・ω・´)キリッ

(。・ω・)ノシ

広告を非表示にする