【问题标题】:Using Markdown with Rails在 Rails 中使用 Markdown
【发布时间】:2012-12-22 19:32:26
【问题描述】:

我希望用户在文本区域中输入 Markdown 文本,当他们发布时,我会显示相应的 html。我读到 Rails 曾经有一个 markdown 方法或类似调用的方法,您可以在 ERB 文件中的该字段上调用:

<%= markdown(@post.content) %>

显然,Rails 取消了该功能。再次获得该功能的最佳方法是什么?这似乎解决了我的需求。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 markdown erb


    【解决方案1】:

    我会使用Redcarpet 进行markdown-html 转换。此外,我会将转换从视图移动到其他对象。您可以使用callbacks (before_save) 或使用Observers

    来自the docs

    markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML,
        :autolink => true, :space_after_headers => true)
    
    markdown.render("This is *bongos*, indeed.")
    #=> "<p>This is <em>bongos</em>, indeed</p>"
    

    您可能希望将结果存储在另一列中,例如@post.content_parsed,以便用户稍后可以对帖子进行编辑,而且这样您就不需要在每次请求时都进行转换。

    【讨论】:

    • 在 Rails 应用程序中实例化 Redcarpet::Markdown 对象的最佳位置在哪里?
    • Redcarpet github 页面建议只实例化一次Redcarpet::Markdown,然后根据需要调用render。有道理,但我应该在哪里只在我的 Rails 应用程序中实例化一次 Redcarpet::Markdown
    • 在这种情况下,您可以创建自己的初始化程序并将新创建的对象分配给一个常量,使其可用于整个应用程序。虽然我永远不会这样做 - 引入和依赖常量会使事情变得难以测试,尤其是在孤立的情况下。
    【解决方案2】:

    提供的解决方案已变成宝石emd。你可以阅读更多here

    将这些行添加到应用程序的 Gemfile:

    gem 'coderay' #optional for Syntax Highlighting
    gem 'redcarpet'
    gem 'emd'
    

    然后执行:

    bundle
    

    要在代码块上创建 markdown 部分、查看或启用语法突出显示,请访问 usage of emd

    【讨论】:

      【解决方案3】:

      这是我的解决方案

      宝石文件

      gem "redcarpet"
      

      config/initializers/markdown_renderer.rb

      module MarkdownRenderer
        def self.markdown
          @@markdown ||=
            Redcarpet::Markdown.new(
              Redcarpet::Render::HTML.new(
                escape_html: true,
                hard_wrap: true,
                safe_links_only: true,
                with_toc_data: true
              ),
              autolink: true,
              fenced_code_blocks: true,
              no_intra_emphasis: true,
              space_after_headers: true,
              tables: true
            )
        end
      
        def self.render(text)
          markdown.render(text)
        end
      end
      

      app/helpers/application_helper.rb

      def markdown(text)
        MarkdownRenderer.render(text).html_safe
      end
      

      你的看法

      <%= markdown(@post.content) %>
      

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        相关资源
        最近更新 更多