我在文章页面上有这个方法,它显示了文章作者和时间戳,它在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'
答案 0 :(得分:0)
首先,它不是
<%= @article.user.'username' %>
但是
<%= @article.user.username %>
您可以在初始化@user的地方显示更多的控制器吗?
更新:根据以下评论中提供的更多信息。错误消息不是“用户”而是“用户”。因此,解决方案是使用_article.html.erb部分提供的“article”对象(最有可能作为另一个视图的渲染部分调用的一部分调用)。
<%= article.user.username %>
答案 1 :(得分:0)
期望@article对象存在,并且您可能没有在索引方法中初始化一个对象。例如,“show”定义它:
def show
@article = Article.find(params[:id])
end
但请确保您的索引方法也有类似的内容,如果确实需要加载文章对象
def index
@articles = Article.all
@article = Article.find(params[:id])
end
现在,我不知道你的目标是什么与索引页面,但你可以从某个地方传入一个特定的ID,以便在“索引”中加载文章对象。因此,这是一个有点人为的例子。
在“索引”方法中实例化对象的常见用例是,如果您在索引页面上有“新文章”表单,并且需要一个空的Article对象来处理。 E.g:
def index
@articles = Article.all
@article = Article.new
end