3

ApplicationHelperに関数があり、事前レンダリング用のコントローラーに正確な複製があります。事前レンダリングは、target = "_ blank"を使用して、希望どおりにリンクを作成しますが、その場でレンダリングすることはできません。私のコードは次のとおりです。

require 'redcarpet'

module ApplicationHelper
  def markdown(text)
    rndr = Redcarpet::Render::HTML.new(:link_attributes => Hash["target" => "_blank"])
    markdown = Redcarpet::Markdown.new(
                rndr,
                :autolink => true,
                :space_after_headers => true
              )
    return markdown.render(text).html_safe
  end
end

これをrailsコンソールで実行すると、リンク属性なしで通常どおりリンクがレンダリングされます。コントローラ内の同一のコードは期待どおりに機能します。

4

1 に答える 1

1

カスタムマークダウンジェネレーター(redcarpet v 3.1.2)を使用してこれを機能させました

lib/my_custom_markdown_class.rb
class MyCustomMarkdownClass < Redcarpet::Render::HTML
  def initialize(extensions = {})
    super extensions.merge(link_attributes: { target: "_blank" })
  end
end

次に、このように使用します

app/helpers/application_helper.rb
def helper_method(text)
  filter_attributes = {
      no_links:    true,
      no_styles:   true,
      no_images:   true,
      filter_html: true
    }

  markdown = Redcarpet::Markdown.new(MyCustomMarkdownClass, filter_attributes)
  markdown.render(text).html_safe
end

または、この helper_method をモデルに配置して、filter_attributes をクラス変数として設定することもできます。

于 2014-08-23T01:02:39.190 に答える