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にアップしていますので、もしよければご利用ください。
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アプリケーション内に以下のファイルを設置したところ治りました。エクステンション内にも同一のファイルはあるはずなのですが、、一体なんででしょうね?
module Spree
module PagesHelper
def render_snippet(slug)
page = Spree::Page.find_by_slug(slug)
raw page.body if page
end
end
end