我如何在没有CodeRay的情况下使用RedCarpet在我的博客中实现降价?

How can I use RedCarpet without CodeRay to implement markdown in my blogs?

所以我耐心地尝试了一段时间与CodeRay gem一起在我的博客中实现降价。它工作了一段时间,但随后它会破坏我的博客页面并出现 500 错误。

CodeRay.scan 被确定为罪魁祸首:

class CodeRayify < Redcarpet::Render::HTML
        def block_code(code, language)
            CodeRay.scan(code, language).div
        end
    end

但即使我将代码重构为如下所示:

class CodeRayify < Redcarpet::Render::HTML
        def block_code(code, language)
            CodeRay.scan(code, language || :text).div
        end
    end

即使我确保在句子开头没有反引号并且我在我的博客中正确实施降价,我仍然遇到同样的问题。

我收到这样的错误:

2017-11-28T23:22:11.456525+00:00 app[web.1]: I, [2017-11-28T23:22:11.456458 #4]  INFO -- : [d03d5e9e-c3c3-4117-85db-d80bd30d9178] Completed 500 Internal Server Error in 38ms (ActiveRecord: 8.5ms)
2017-11-28T23:22:11.457321+00:00 app[web.1]: F, [2017-11-28T23:22:11.457251 #4] FATAL -- : [d03d5e9e-c3c3-4117-85db-d80bd30d9178]
2017-11-28T23:22:11.457384+00:00 app[web.1]: F, [2017-11-28T23:22:11.457321 #4] FATAL -- : [d03d5e9e-c3c3-4117-85db-d80bd30d9178] ActionView::Template::Error (Invalid id given: console.log("Hello!");```):
2017-11-28T23:22:11.457592+00:00 app[web.1]: F, [2017-11-28T23:22:11.457534 #4] FATAL -- : [d03d5e9e-c3c3-4117-85db-d80bd30d9178]     4:
2017-11-28T23:22:11.457593+00:00 app[web.1]: [d03d5e9e-c3c3-4117-85db-d80bd30d9178]     5:     <% render partial: 'blogs/admin_actions', locals: {blog: blog} %>
2017-11-28T23:22:11.457595+00:00 app[web.1]: [d03d5e9e-c3c3-4117-85db-d80bd30d9178]     6:
2017-11-28T23:22:11.457595+00:00 app[web.1]: [d03d5e9e-c3c3-4117-85db-d80bd30d9178]     7:     <p><% markdown blog.body %></p>
2017-11-28T23:22:11.457596+00:00 app[web.1]: [d03d5e9e-c3c3-4117-85db-d80bd30d9178]     8:
2017-11-28T23:22:11.457597+00:00 app[web.1]: [d03d5e9e-c3c3-4117-85db-d80bd30d9178]     9:  </div><!-- /.blog-post -->
2017-11-28T23:22:11.457648+00:00 app[web.1]: F, [2017-11-28T23:22:11.457586 #4] FATAL -- : [d03d5e9e-c3c3-4117-85db-d80bd30d9178]
2017-11-28T23:22:11.457718+00:00 app[web.1]: F, [2017-11-28T23:22:11.457654 #4] FATAL -- : [d03d5e9e-c3c3-4117-85db-d80bd30d9178] app/helpers/blogs_helper.rb:8:in `block_code'
2017-11-28T23:22:11.457719+00:00 app[web.1]: [d03d5e9e-c3c3-4117-85db-d80bd30d9178] app/helpers/blogs_helper.rb:23:in `render'
2017-11-28T23:22:11.457720+00:00 app[web.1]: [d03d5e9e-c3c3-4117-85db-d80bd30d9178] app/helpers/blogs_helper.rb:23:in `markdown'
2017-11-28T23:22:11.457721+00:00 app[web.1]: [d03d5e9e-c3c3-4117-85db-d80bd30d9178] app/views/blogs/_blog.html.erb:7:in `_app_views_blogs__blog_html_erb__2572357733169721276_60667300'
2017-11-28T23:22:11.457721+00:00 app[web.1]: [d03d5e9e-c3c3-4117-85db-d80bd30d9178] app/views/blogs/index.html.erb:5:in `_app_views_blogs_index_html_erb__3522254122931434539_63043240'

这就是我在 Javascript 博客上写 markdown 的方式:

Below are examples of four primitive data types that lay the foundation for all JavaScript programs. Primitive data types, as their name implies, are the simplest built-in forms of data. For example:

```javascript
console.log('New York City');
console.log(40.7);
console.log(true);
console.log(null);
```

这是正确的做法,为什么会出现错误?根据以往的heroku日志,是这个问题:

CodeRay.scan(code, language).div

但即使我将其更改为:

CodeRay.scan(code, language || :text).div

我仍然遇到同样的问题。所以我想知道如何在没有 CodeRay 的情况下将 RedCarpet 实现到下面的代码中:

module BlogsHelper
    def gravatar_helper user
        image_tag "https://www.gravatar.com/avatar/#{Digest::MD5.hexdigest(user.email)}", width: 60
    end

    class CodeRayify < Redcarpet::Render::HTML
        def block_code(code, language)
            CodeRay.scan(code, language || :text).div
        end
    end

    def markdown(text)
        coderayify = CodeRayify.new(filter_html: true, hard_wrap: true)

        options = {
            fenced_code_blocks: true,
            no_intra_emphasis: true,
            autolink: true,
            lax_html_blocks: true,
        }

        markdown_to_html = Redcarpet::Markdown.new(coderayify, options)
        markdown_to_html.render(text).html_safe
    end

    def blog_status_color blog
        'color: red;' if blog.draft?
    end
end

问题可能与 Coderay 或 RedCarpet 无关。可能只是数据问题。这个错误 ActionView::Template::Error (Symbol or String expected, but NilClass given.) 意味着它期待内容但根本没有得到任何内容,因此它可能是数据验证问题或类似问题。

因此您可能需要解决数据验证问题或使用 CKEditor 等替代方案。