パーシャルの一部をマークダウンスニペットとして使用したいと思います。標準のRails erbテンプレートを使用してそれらをレンダリングする最も簡単な方法は何ですか?
理想的には、次のようなことをしたいと思います。
app/views/_my_partial.md.erbにパーシャルがある場合:
My awesome view
===============
Look, I can **use** <%= language %>!
私はそのような観点から参照します:
<%= render "my_partial", :language => "Markdown!" %>
次のような出力を取得したい:
<h1>My awesome view</h1>
<p>Look, I can <strong>use</strong> Markdown!</p>
結局のところ、これを行う正しい方法(tm)はActionView::Template.register_template_handler
を使用しています。
lib/markdown_handler.rb:
require 'rdiscount'
module MarkdownHandler
def self.erb
@erb ||= ActionView::Template.registered_template_handler(:erb)
end
def self.call(template)
compiled_source = erb.call(template)
"RDiscount.new(begin;#{compiled_source};end).to_html"
end
end
ActionView::Template.register_template_handler :md, MarkdownHandler
require 'markdown_handler'
(または初期化子)にconfig/application.rb
がある場合、拡張子.html.md
を使用して、ERb補間を使用して任意のビューまたは部分をMarkdownとしてレンダリングできます。
app/views/home/index.html.md:
My awesome view
===============
Look, I can **use** <%= @language %>!
app/controllers/home_controller.rb:
class HomeController < ApplicationController
def index
@language = "Markdown"
end
end
純粋なマークダウンソリューションではありませんが、 HAMLフィルター を使用してマークダウンや他のマークアップ言語をレンダリングできます。
たとえば、app/views/_my_partial.html.haml
:
:markdown
My awesome view
===============
Look, I can **use** #{language}!
.html.md
ビューを処理する markdown-Rails gemをリリースしました。
ただし、Erbとチェーンすることはできません。静的ビューとパーシャル専用です。 Rubyコードを埋め込むには、:markdown
でtjwallaceのソリューションを使用する必要があります。
そのような状況でhamlを使用しない方法を見つけました。
in views/layouts/_markdown.html.erb
<%= m yield %>
でapp/helpers/application_helper.rb
def m(string)
RDiscount.new(string).to_html.html_safe
end
でGemfile
gem 'rdiscount'
したがって、ビューでは、次のように呼び出すことができます。
<%= render :partial => "contract.markdown", :layout => 'layouts/markdown.html.erb' %>
そしてcontract.markdownはマークダウンとしてフォーマットされます
すでに提示されているソリューションを積み重ねると、これはRails 3で、Hamlの:markdown
フィルターとRDiscountの宝石。唯一の落とし穴は、MarkdownファイルがHamlファイルであるということですが、コピー担当者のような人にとっては問題ではありません。
Gemfile:
gem 'rdiscount'
app/views/my_page.html.haml
:markdown
#{render 'my_partial', language: 'Markdown!'}
app/views/_my_partial.html.haml
My awesome view
===============
Look, I can **use** #{language}!
:language
変数をマークダウンファイルに渡す必要がない場合は、マークダウンをHamlファイルにすることで完全になくすことができます。
app/views/my_page.html.haml
:markdown
#{render 'my_partial.md'}
app/views/_my_partial.md
My awesome view
===============
Sorry, cannot **use** #{language} here!
Markdownファイルの厄介なアンダースコアが気に入らないですか?
app/views/my_page.html.haml
:markdown
#{render file: 'my_markdown.md'}
app/views/my_markdown.md
My awesome view
===============
Sorry, cannot **use** #{language} here!
レバレッジ あなたの答え Rails(HTML :: Pipeline経由): https://github.com)でGitHubフレーバーマークダウン用にレンダリングする宝石を作成する/ afeld/html_pipeline_Rails
これは@Jacobに似たバージョンですが、 Redcarpet を使用しています。
module MarkdownHandler
def self.erb
@erb ||= ActionView::Template.registered_template_handler(:erb)
end
def self.call(template)
options = {
fenced_code_blocks: true,
smartypants: true,
disable_indented_code_blocks: true,
prettify: true,
tables: true,
with_toc_data: true,
no_intra_emphasis: true
}
@markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, options)
"#{@markdown.render(template.source).inspect}.html_safe"
end
end
ActionView::Template.register_template_handler :md, MarkdownHandler
lencioni これを投稿した人への完全なクレジット この要点で 。
そしてerbを評価したい場合:
erb = ERB.new(template.source).result
@markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, options)
"#{@markdown.render(erb).inspect}.html_safe"
埋め込みMarkdownはRails 5で使用できます。埋め込みMarkdownは、Jacobが提供するソリューションに基づいています 上記
gem 'coderay' #optional for Syntax Highlighting
gem 'redcarpet'
gem 'emd'
bundle install
。
次に、ビューを作成しますapp/view/home/changelog.html.md
そしてその中にマークダウンを貼り付けます.md
ファイル。
次のコマンドを使用してホームコントローラーを生成します
Rails generate controller home
Route.rbに次の行を追加します。
get '/changelog', :to 'home#changelog'
それで全部です。 http:// localhost:3000/changelog にアクセスして、レンダリングされたマークダウンを確認します