Rails 3.2 - best_in_place - 編集中の日付値形式の問題
概要
Rails 3.2 Web アプリケーションでは、best_in_place gem を使用して基本的な履歴書テンプレートを作成しました。タイプ:date に問題があります。デフォルトでは日付が yyyy-mm-dd 形式で表示されますが、表示と編集の両方で mm/dd/yyyy 形式が必要です。表示形式を変更するには、best_in_place のヘルパー display_as: を使用しました。形式が変更されたことがわかりました。
問題は、値をクリックして編集すると、再び古い形式 (yyyy-mm-dd) に戻ってしまうということです。これがそのコードです。
ビュー:
<div id="resume_template">
<div id="user_personal_info" class="sub_template" align="center">
<div class="title_section"><b>PERSONAL PROFILE</b></div>
<hr>
<table width="100%">
<tr>
<td valign="middle"align="right" width="35%">NAME</td>
<td valign="middle"width="10%" class="colon_td">:</td>
<td valign="middle"width="55%"><%= get_user_content('name') %></td>
</tr>
<tr>
<td valign="middle"align="right" width="35%">EMAIL</td>
<td valign="middle"width="10%" class="colon_td">:</td>
<td valign="middle"width="55%"><%= get_user_content('email') %></td>
</tr>
<tr>
<td valign="middle"align="right" width="35%">DATE OF BIRTH</td>
<td valign="middle"width="10%" class="colon_td">:</td>
<td valign="middle"width="55%"><%= best_in_place @resume, :dob, url: resume_path(@resume), type: :date, display_as: :format_dob %></td>
</tr>
<tr>
<td valign="middle"align="right" width="35%">GENDER</td>
<td valign="middle"width="10%" class="colon_td">:</td>
<td valign="middle"width="55%"><%= best_in_place @resume, :gender, type: :select, collection: [[0, 'Male'], [1, "Female"]], value: @resume.gender %></td>
</tr>
<tr>
<td valign="middle"align="right" width="35%">MARITAL STATUS</td>
<td valign="middle"width="10%" class="colon_td">:</td>
<td valign="middle"width="55%"><%= best_in_place @resume, :marital_status, type: :select, collection: [[0, 'Single'], [1, "Married"]] %></td>
</tr>
<tr>
<td valign="middle"align="right" width="35%">LINGUISTIC ABILITY</td>
<td valign="middle"width="10%" class="colon_td">:</td>
<td valign="middle"width="55%"><%= best_in_place @resume, :linguistic_ability %></td>
</tr>
<tr>
<td valign="middle"align="right" width="35%">NATIONALITY</td>
<td valign="middle"width="10%" class="colon_td">:</td>
<td valign="middle"width="55%"><%= best_in_place @resume, :nationality %></td>
</tr>
</table>
</div>
<div id="user_education_info" class="sub_template" >
<div class="title_section"><b>EDUCATIONAL BACK GROUND/QUALIFICATION</b></div>
<hr>
<%= best_in_place @resume, :educational_info, type: :textarea %>
</div>
<div id="user_prof_exp_info" class="sub_template" >
<div class="title_section"><b>WORK EXPERIENCE</b></div>
<hr>
<%= best_in_place @resume, :work_experience_info, type: :textarea %>
</div>
<div id="user_certification_info" class="sub_template" >
<div class="title_section"><b>CERTIFICATION</b></div>
<hr>
<%= best_in_place @resume, :certification_info, type: :textarea %>
</div>
</div>
<script type="text/javascript">
$( document ).ready( function (){
// $.extend($.fn.datepicker.defaults, { format: 'mm/dd/yy' });
/* $.datepicker.setDefaults({
dateFormat: 'mm/dd/yy'
});*/
jQuery(".best_in_place").best_in_place();
});
</script>
モデル:
class Resume < ActiveRecord::Base
belongs_to :user
attr_accessible :certification_info, :dob, :educational_info, :gender, :linguistic_ability, :marital_status, :nationality, :work_experience_info
def format_dob
self.dob.strftime("%m/%d/%Y")
end
end
参考のために 2 つのスクリーンショットを添付しました。表示されない場合は、画像をダウンロードして拡大してください。
解決策
解決策は見つかりましたが、Rails の規約に従ってそれがどの程度適切なのかわかりません。
解決:
モデル自体の dob フィールド値をオーバーライドするだけです。こちらがResumeモデルです。
class Resume < ActiveRecord::Base
belongs_to :user
attr_accessible :certification_info, :dob, :educational_info, :gender, :linguistic_ability, :marital_status, :nationality, :work_experience_info
def dob
if self.read_attribute(:dob)
self.read_attribute(:dob).to_date.strftime("%m/%d/%Y")
else
self.read_attribute(:dob)
end
end
end
このソリューションを使用すると、best_in_place で display_as ヘルパーを使用する必要さえありません。編集可能モードと非編集モードの両方で、値が mm/dd/yyyy 形式で表示されます。