在此处工作。刚刚介绍了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_title
和markdown_body
方法上删除private
单词,以使其可用于您的视图。此外,由于要求将render_as_markdown
私有化,因此您需要将其移动到 private
关键字下方。长话短说,您的方法应在班级中构造如下:
def markdown_title(markdown)
...
end
def markdown_body(markdown)
...
end
private
def render_as_markdown(markdown)
...
end
第二,如果您看一下应该调用markdown_title
和markdown_body
的方式(下图),它们不使用任何参数。
<%= post.markdown_title %>
<%= post.markdown_body %>
因此,您的Post
对象方法markdown_title
和markdown_body
不应采用任何参数。而且,由于它们被称为Post
类的特定对象,因此它们无需接受任何。
def markdown_title
render_as_markdown(self.title)
end
def markdown_body
render_as_markdown(self.body)
end
然后,在您的视图中,您可以根据要求使用markdown_title
和markdown_body
:
<h1><%= @post.markdown_title %></h1>
<div class="row">
<div class="col-md-8">
<p><%= @post.markdown_body %>
</div>
...
</div>