Techioz Blog

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 形式で表示されます。