Rails アプリにWordPress のショートコードの概念を(多かれ少なかれ) 実装しています。問題は、ビューで:yield
定義されたレイアウトで何かを行うcontent_for
と、それが空白になることです。そのため、追加の JavaScript タグとタイトル タグはレンダリングされません。
つまり、レイアウトで呼び出すcontent_for? :title
と false が返されます。
これだけ起こる投稿/インデックスで、ログインしている場合のみ filter_shortcodes
ヘルパーが実行されたとき。誰もこのようなことに遭遇したことがありますか?
ビュー/投稿/index.html.haml:
- content_for :script do
= javascript_include_tag '/assets/autoload.js'
- content_for :title do
Blog
...
= render template: 'article-content',
そして、views/article-content.html.haml (filter_shortcodes
はShortcode
モジュールで定義されたヘルパー関数です):
:plain
#{filter_shortcodes instance.content}
問題は私のショートコード モジュールにあると私は確信しています。
module Shortcode
def filter_shortcodes content
content.gsub /(?<!\\)\[.+\]/ do |code|
# A shortcode must:
# - be on its own line
# - be [contained within square brackets]
# - be named using only lowercase letters
# If it contains parameters, they must come in the form:
# key="value"
shortcode = /^\s*\[(?<name>[a-z]+) (?<params>.*)\s*\]\s*$/.match code
params_list = shortcode[:params].gsub /"|"/, '"'
param_regexp = /([a-z]+)="([^"]*)"/
shortcode_params = {}
params_list.scan param_regexp do |param|
shortcode_params[param[0].to_sym] = param[1]
end
render_to_string template: "shortcodes/#{shortcode[:name]}",
:locals => shortcode_params, layout: false
end
end
end