我在文章页面上有这个方法,它显示了文章作者和时间戳,它在view/articles/show.html.erb中工作正常。但是当我在/views/articles/_article.html.erb 下的索引页面上放置相同的方法时,我不断收到此错误 - 它在一个页面显示中有效,但在另一个页面显示中无效。有什么建议吗?
"错误:"
NoMethodError in Articles#index
Showing /Users/blog/app/views/articles/_article.html.erb where line #13 raised:
undefined method `User' for nil:NilClass
Extracted source (around line #13):
11:
12: <div class="post_by">
13: Posted by <%= @article.user.'username' %> on <%= @article.created_at.strftime("%B %d, %Y") %>
14: </div>
15:
Trace of template inclusion: app/views/articles/index.html.erb
Rails.root: /Users/blog
Application Trace | Framework Trace | Full Trace
app/views/articles/_article.html.erb:13:in `_app_views_articles__article_html_erb__997953145_2197490260_6874828'
app/views/articles/index.html.erb:15:in `_app_views_articles_index_html_erb___514612748_2197511860_0'
app/controllers/articles_controller.rb:11:in `index'
它期望存在一个@article对象,并且您可能没有在索引方法中初始化一个对象。例如,"show"定义了它:
def show
@article = Article.find(params[:id])
end
但是,请确保您的索引方法也有类似的东西,如果您确实需要加载文章对象
def index
@articles = Article.all
@article = Article.find(params[:id])
end
现在,我不知道您对索引页面的目标是什么,但是您可以从某个地方传入特定ID,以便在"index"中加载文章对象。因此,这是一个有点人为的例子。
在"index"方法中实例化对象的一个常见用例是,如果索引页本身上有"New Article"表单,并且需要一个空的文章对象才能工作。 例如:
def index
@articles = Article.all
@article = Article.new
end
首先,它不是
<%= @article.user.'username' %>
但
<%= @article.user.username %>
您能否在初始化@user的位置展示更多控制器?
更新:基于下面评论中给出的更多信息。错误消息不是在"用户"上,而是在"用户"上。因此,解决方案是使用 _article.html.erb 部分提供的"article"对象(很可能作为从另一个视图呈现部分调用的一部分调用)。
<%= article.user.username %>