Redcarpet Markdown 转换方法,NoMethodError
Redcarpet Markdown Conversion Method, NoMethodError
正在处理这里的作业。刚刚介绍了 Redcarpet 和 Markdown 转换方法。
这是放在我的助手里面的:
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>
现在我必须执行以下操作:
The goal is to render markdown like so:
<%= post.markdown_title %>
<%= post.markdown_body %>
Add Post#markdown_title and Post#markdown_body to Post:
Create a private Post#render_as_markdown method that markdown_title
and markdown_body can call. This will keep the markdown_title and
markdown_body DRY.
Remove the markdown_to_html method from application_helper.rb.
Update your views to use the Post#markdown_title and
Post#markdown_body methods.
到目前为止我已经尝试这样做了:
models/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 in Posts#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
设为 class 中的私有方法,因此您无法在视图中访问它。您需要从 markdown_title
和 markdown_body
方法上方删除 private
一词,以便它们可用于您的视图。此外,由于要求将 render_as_markdown
设为私有,因此您需要将 移动到 关键字 private
下方。长话短说,您的方法在 class 中的结构应如下所示:
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
不应接收任何参数。而且由于它们是在 class 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>
正在处理这里的作业。刚刚介绍了 Redcarpet 和 Markdown 转换方法。
这是放在我的助手里面的:
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>
现在我必须执行以下操作:
The goal is to render markdown like so:
<%= post.markdown_title %>
<%= post.markdown_body %>
Add Post#markdown_title and Post#markdown_body to Post:
Create a private Post#render_as_markdown method that markdown_title and markdown_body can call. This will keep the markdown_title and markdown_body DRY.
Remove the markdown_to_html method from application_helper.rb.
Update your views to use the Post#markdown_title and Post#markdown_body methods.
到目前为止我已经尝试这样做了:
models/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 in Posts#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
设为 class 中的私有方法,因此您无法在视图中访问它。您需要从 markdown_title
和 markdown_body
方法上方删除 private
一词,以便它们可用于您的视图。此外,由于要求将 render_as_markdown
设为私有,因此您需要将 移动到 关键字 private
下方。长话短说,您的方法在 class 中的结构应如下所示:
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
不应接收任何参数。而且由于它们是在 class 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>