LoginSignup
5
6

More than 5 years have passed since last update.

Spreeに静的ページの管理機能を追加する

Posted at

Spreeの管理画面から静的なページを作成、編集する機能を追加しましょう。

デフォルトのSpreeは管理画面から静的ページを編集できる機能を搭載していないため、もしサイト内に静的ページを設けたい場合にはRailsのpublicディレクトリ内にページを作成するなど、少々不便なところがあります。

そんなときに役立つのがこのエクステンションです。

spree-contrib/spree_static_content

これをインストールすることで、Spreeの管理画面からページを簡単に編集することができるようになります。

エクステンションのインストール

インストールは簡単です。まずは以下をGemfileに記載しましょう。branchの部分は、Spreeのバージョンにあわせて書き換えてください。

gem 'spree_static_content', github: 'spree-contrib/spree_static_content', branch: '3-0-stable'

次にこちらのコマンドを実行。

bundle && bundle exec rails g spree_static_content:install

これで完了です。rails sすると、管理画面のメニューから静的ページが管理できるようになります。便利ですね。

エクステンションの日本語化

エクステンション内に日本語のロケールファイルが存在しないので、translation missingが発生します。とりあえず私のロケールファイルをGistにアップしていますので、もしよければご利用ください。

spree_static_content_ja.yml

HowTo (Github READMEの日本語訳です)

管理者タブで「ページ」オプションを使用でき、静的ページをSpreeに追加することができます。ページ内容は直接データベースより引き出され、レイアウトファイル、部分ファイルとを分けて管理できます。

管理者タブで、「新しいページ」から新しい静的ページを作成できます。

ロードされるタイトル、スラグ(URL)、本文とメタフィールドをそれぞれ書き換えることができます。タイトル、スラグ、本文は必須項目です。

layout、partialが指定されていないものは、データベースから読み込まれた後にSpreeアプリケーションのレイアウトの中に読み出されます。

レイアウト、パーシャルレンダリング

Spreeアプリケーションのレイアウトを使わずにページを返すなら、レイアウトファイルを相対パスで指定してください(例:spree/layouts/layout_file_name)このファイルにはアンダースコアによるプリフィックスは不要です。

パーシャルとして返すならば、レイアウトファイル名にパスを指定して、「部分レイアウトとして表示」オプションをチェックしてください。レイアウトエリアで指定されるパスにはアンダースコアは含まれませんが、ファイル名には必須です。

また、render_snippetヘルパーが使えることも覚えておくてください。スラグによってページを見つけ、そのページボディをあなたのビューの任意の場所にレンダリングします。

オプション

「〜に表示」チェックボックスで、ヘッダー、フッター、サイドバーにそのページへのリンクを表示するかどうかを指定することができます。「位置」でそれらの表示される順番を設定できます。

最後に、「公開」チェックボックスで公開/非公開を切り替えます。もしチェックされていないならば、そのページは開くことができません。

使い方

基本的な使い方

BODYにはHTMLが使えます。

「公開」チェックボックスにチェックを入れて、STOREチェックボックスの該当ストアにもチェックを入れて保存するとページが公開されます。

「サイドバーに表示」「ヘッダーに表示」等にチェックを入れると、いわゆるグローバルナビゲーション部にページへのリンクが表示されます。

一歩進んだ使い方

spree/layouts/layout.html.erbにようなレイアウトファイルをSpreeアプリケーション内に用意しておき、それを管理画面で指定してあげることでそのレイアウトファイルを使用してページを表示することができます。

また、erbファイル内でrender_snippetメソッドを用いてスラグを指定することで、ページを引用して表示することができます。

こんな感じで使います。

<%= render_snippet('/footer_links') %>

よくわからない点

「部分レイアウトとして表示」の使い方が不明です。render_snippetメソッドがあるのに何に使うのでしょう。色々試してみましたが結局用途も使い方もわかりませんでした。

不具合?

原因不明ですし、私だけなのかもしれませんが、3-0-stableでrender_snippetを使うとNoMethodError in Spree::StaticContent#showが表示されます。undefined method 'render_snippet'と表示されているので、なんらかの影響でエクステンション内のヘルパーが読み込まれていない模様です。

根本的な解決ではありませんが、Spreeアプリケーション内に以下のファイルを設置したところ治りました。エクステンション内にも同一のファイルはあるはずなのですが、、一体なんででしょうね?

app/helpers/spree/pages_helper.rb
module Spree
  module PagesHelper
    def render_snippet(slug)
      page = Spree::Page.find_by_slug(slug)
      raw page.body if page
    end
  end
end
5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6