Railsで部分テンプレートを使いながらcreate,newとupdate,editでsubmitボタンの表示を簡単に切り替える方法

Railsでnewとeditページでsubmitボタンの表示を切り替える方法です。

scaffoldでCRUDを作成するとわかるのですが、すでにこの機能がRailsには内蔵されています。

editとupdateでsubmitボタンの表示が切り替わってますね。
f:id:ihatov08:20160713181101p:plain

scaffoldで作成した際に、部分テンプレートを使っているのですが、railsがcreateなのかupdateなのか判断して、表示の切り替えを行ってくれています。

_form.html.erb

<%= form_for(@event) do |f| %>
<% if @event.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@event.errors.count, "error") %> prohibited this event from being saved:</h2>
<ul>
<% @event.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :title %><br>
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description %>
</div>
<div class="field">
<%= f.label :start_time %><br>
<%= f.datetime_select :start_time %>
</div>
<div class="field">
<%= f.label :end_time %><br>
<%= f.datetime_select :end_time %>
</div>
<div class="actions">
<%= f.submit %> #createもupdateも同じsubmitヘルバーを使っている。
</div>
<% end %>

これを日本語表示に切り替えたい場合、viewに<%= f.submit '作成' %>と記述してしまうとcreateとupdateで同じviewを使っているため更新ボタンの実装ができません。
三項演算子を使って表示を切り替える方法もありますが、あまりスマートではありませんね。

<p><%= f.submit @user.new_record? ? "Create my account" : "Update my account" %></p>

I18nに対応しつつ、createとupdateで表示を切り替えるにはymlファイルで定義するとRailsがうまいことやってくれます。

ja:
activerecord:
models:
event: イベント
user: ユーザー
attributes:
events: イベント
users: ユーザー
helpers:
submit:
create: "%{model}作成"
update: "%{model}更新"

Railsがどのmodelに基づくviewなのか判断して、表示を切り替えてくれます。%{model}で変数的にymlで値を渡してあげるのがミソです。

events/new

f:id:ihatov08:20160713182147p:plain

events/:id/edit

f:id:ihatov08:20160713182156p:plain

users/new

f:id:ihatov08:20160713182200p:plain

users/:id/edit

f:id:ihatov08:20160713182204p:plain

Railsを学ぶなら以下の本がおすすめです。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

改訂3版 基礎 Ruby on Rails 基礎シリーズ

改訂3版 基礎 Ruby on Rails 基礎シリーズ

実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング

実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA