Spree で、slug の自動作成を防止する方法

ruby on rails で作られたCMS、Spree の管理画面から商品を新規作成する際、Slug は商品名称(name)と品番(sku)から英数字だけをつなぎあわせて自動生成されますが、
日本語の品名だけだと、Slug が空になりバリデーションエラー(3文字以上入力してください)になってしまいます。

回避方法としては

  • 日本語のslugを許容させる
  • slug の入力項目を作る。

のどちらかです。
ただし、後者で対処する場合、入力項目を作っても商品名称(name)と品番(sku)で強制的に上書きされてしまい、入力した項目は反映されません。
それを回避するには、Spree::Producrt のDecoratorを作って下記コードを埋め込めば回避できます。

/app/models/spree/product_decorator.rb

Spree::Product.class_eval do
  ...
  def slug_candidates_with_slug
    [:slug]
  end
  alias_method_chain :slug_candidates, :slug
end

こんな感じのコードです。

これは、spree core の product モデルに、フレンドリURLを実現するために friendly_id が呼ばれているためです。

    friendly_id :slug_candidates, use: :slugged

ちなみに、slug_candidates メソッドの中身は下記のようになってます。

    # Try building a slug based on the following fields in increasing order of specificity.
    def slug_candidates
      [
          :name,
          [:name, :sku]
      ]
    end

これを decorator で上書き(正確には、メソッドに別の名前をつけて呼び出しを回避)したわけです。

はぁ、spree は日本語の資料が少ないので大変だ…

RSS / feedly
  • follow us in feedly
  • follow us in feedly
ソーシャル
広告