ユカシカド エンジニアブログ

体の栄養状態を把握する検査サービス VitaNoteを開発するエンジニアのブログ

(翻訳)Spreeドキュメント - Defaceでエクステンションを改善する

(翻訳)Spreeドキュメント - エクステンション(2/2)の続き。 ですが、Defaceの説明については (翻訳)Spreeドキュメント - Viewのカスタマイズと重複するので 途中のImproving Our Extension Using Defaceから。

※ 誤訳意訳多々注意

自分の残念な英語力ではぴんとこない箇所は英語のままpending。怪しい訳多し。

実践もしくは英語力の向上を伴って正しく理解することがあれば、加筆・修正する予定です。

この記事は2013/07/17現在のものです。

翻訳元: DEFACE OVERRIDES - SPREE DEVELOPER

Defaceを使ってエクステンションを改善する(original)

ゴール(original)

管理画面の商品編集ページで'セール価格'を追加して更新できるようにすることです。Spreeのビューをオーバライドすることで実現できますが、そのやり方は潜在的な技術的問題があります。既にビューをオーバライドしていることで、Spreeの新しいリリースで更新されたビューを適用できなくなります。We would need to update our view with the new content from Spree and then add our customizations back in to stay fully up to date.

かわりにDefaceを使って実現する方法を学んでいきましょう。Defaceを使うことで’app/overrides’に変更内容を集約して、いつでもSpreeのビューの最新の実装を使うことができます。

実装(original)

TODO: この作業は全て’/core'ではなくて’/backend'下でおこなう必要があります。

管理画面の商品ページをオーバライドしたいので、この場合修正する対象となるのは部分テンプレートになります。 そのファイルは'spree/admin/products/_form.html.erb'というパスになるでしょう。

まずディレクトリを作成してください:

$ mkdir app/overrides

そして'spree/admin/products/_form.html.erb'をオーバライドしていきます。これはファイルの一部分(完全なファイルを確認することもできます)で、ここのコンテンツを追加していきます:

<div class="right four columns omega" data-hook="admin_product_form_right">
<%= f.field_container :price do %>
    <%= f.label :price, raw(Spree.t(:master_price) + content_tag(:span, ' *',
     :class => 'required')) %>
    <%= f.text_field :price, :value => number_to_currency(@product.price,
      :unit => '') %>
    <%= f.error_message_on :price %>
<% end %>

この状態から、:priceフィールドの後に別のフィールドを追加します。’app/overrides/add_sale_price_to_product_edit.rb’を作成して以下のようにコードを追加してください:

Deface::Override.new(:virtual_path => 'spree/admin/products/_form',
  :name => 'add_sale_price_to_product_edit',
  :insert_after => "code[erb-loud]:contains('text_field :price')",
  :text => "
    <%= f.field_container :sale_price do %>
      <%= f.label :sale_price, raw(t(:sale_price) + content_tag(:span, ' *')) %>
      <%= f.text_field :sale_price, :value =>
        number_to_currency(@product.sale_price, :unit => '') %>
      <%= f.error_message_on :sale_price %>
    <% end %>
  ")

更新された情報を得るためにもう1つ変更しなければならないところがあります。’Spree::Product’モデルで’sale_price’を’attr_accessible’で指定し、'sale_price'をmaster variant へ移譲する必要があります。

それは、新たに'app/models/spree/product_decorator.rb'を作成して、以下のように書くことで可能です:

module Spree
  Product.class_eval do
    delegate_belongs_to :master, :sale_price

    attr_accessible :sale_price
  end
end

http://localhost:3000/admin/products へアクセスして商品情報を編集すると、’セール価格’を入力できるようになっているのと、’http://localhost:3000/sale’へアクセスするとその商品が表示されるようになっています。 ※ おそらく反映するには再起動する必要があるでしょう。