RedCarpet Markdown转换方法,nomethoderror



在此处工作。刚刚介绍了RedCarpet和Markdown Conversion方法。

这放在我的助手内:

def markdown_to_html(markdown)
  renderer = Redcarpet::Render::HTML.new
  extensions = { fenced_code_blocks: true }
  redcarpet = Redcarpet::Markdown.new(renderer, extensions)
  (redcarpet.render markdown).html_safe
end

我可以在我的观点中调用该方法:

views/posts/show.html.erb:

<h1><%= markdown_to_html @post.title %></h1>
<div class="row">
  <div class="col-md-8">
    <p><%= markdown_to_html @post.body %>
  </div>
  <div class="col-md-4">
    <% if policy(@post).edit? %>
      <%= link_to "Edit", edit_topic_post_path(@topic, @post), class: 'btn btn-success' %>
    <% end %>
  </div>
</div>

现在我必须执行以下操作:

目标是这样:

这样
<%= post.markdown_title %>
<%= post.markdown_body %>

创建一个私人帖子#render_as_markdown方法markdown_title Markdown_body可以打电话。这将使Markdown_title和 Markdown_body Dry。

从application_helper.rb。

删除markdown_to_html方法

更新您的视图以使用帖子#markdown_title和 帖子#markdown_body方法。

到目前为止,我已经尝试这样做:

型号/post.rb:

class Post < ActiveRecord::Base
  has_many :comments
  belongs_to :user
  belongs_to :topic
  # Sort by most recent posts first
  default_scope { order('created_at DESC') }
  # Post must have at least 5 characters in the title
  validates :title, length: { minimum: 5 }, presence: true
  # Post must have at least 20 characters in the body
  validates :body, length: { minimum: 20 }, presence: true
  # Post must have an associated topic and user
  validates :topic, presence: true
  validates :user, presence: true
  def render_as_markdown(markdown)
    renderer = Redcarpet::Render::HTML.new
    extensions = { fenced_code_blocks: true }
    redcarpet = Redcarpet::Markdown.new(renderer, extensions)
    (redcarpet.render markdown).html_safe
  end
  private 
  def markdown_title(markdown)
    render_as_markdown(markdown).title
  end
  def markdown_body(markdown)
    render_as_markdown(markdown).body
  end
end

如果我们返回我的 views/posts/show.html.erb:

<h1><%= @post.title.markdown_title %></h1>

将渲染:

帖子中的nomethoderror#show

undefined method `markdown_title' for "chopper mag":String
Extracted source (around line #1):
<h1><%= @post.title.markdown_title %></h1>
<div class="row">
  <div class="col-md-8">
    <p><%= markdown_to_html @post.body %>
  </div>

我在做什么错,如何纠正这个问题?

请感谢。

这里的几件事。首先,您将markdown_title在您的课程中成为私人方法,因此在您的视图中无法访问它。您需要从markdown_titlemarkdown_body方法上删除private单词,以使其可用于您的视图。此外,由于要求将render_as_markdown私有化,因此您需要将其移动到 private关键字下方。长话短说,您的方法应在班级中构造如下:

def markdown_title(markdown)
  ...
end
def markdown_body(markdown)
  ...
end
private 
def render_as_markdown(markdown)
  ...
end

第二,如果您看一下应该调用markdown_titlemarkdown_body的方式(下图),它们不使用任何参数。

<%= post.markdown_title %>
<%= post.markdown_body %>

因此,您的Post对象方法markdown_titlemarkdown_body不应采用任何参数。而且,由于它们被称为Post类的特定对象,因此它们无需接受任何。

def markdown_title
  render_as_markdown(self.title)
end
def markdown_body
  render_as_markdown(self.body)
end

然后,在您的视图中,您可以根据要求使用markdown_titlemarkdown_body

<h1><%= @post.markdown_title %></h1>
<div class="row">
  <div class="col-md-8">
    <p><%= @post.markdown_body %>
  </div>
  ...
</div>

相关内容

  • 没有找到相关文章

最新更新