我是Rails的新手并且一直关注在线教程,其中涉及创建一个简单的博客站点。我正处于为控制器和模型添加测试的项目中。当我尝试运行posts_controller_test.rb时,出现以下错误:
Error:
PostsControllerTest#test_should_get_index:
ActionView::Template::Error: undefined method `name' for nil:NilClass
app/views/posts/index.html.erb:7:in `block in _app_views_posts_index_html_erb__805998677_54338856'
app/views/posts/index.html.erb:1:in `_app_views_posts_index_html_erb__805998677_54338856'
test/controllers/posts_controller_test.rb:5:in `block in <class:PostsControllerTest>'
bin/rails test test/controllers/posts_controller_test.rb:4
这是我的posts_controller_test.rb:
class PostsControllerTest < ActionDispatch::IntegrationTest
test "should get index" do
get posts_url
assert_response :success
assert_not_nil assigns(:posts)
end
end
本教程是在早期版本的rails上生成的,它使用了get:index,我读过它在rails 5中已弃用,建议使用URL而不是action name。
有趣的是,如果我执行控制器home_controller_test.rb(我甚至没有修改过),我会在下面得到一个不同的错误:
Error:
HomeControllerTest#test_should_get_index:
NameError: undefined local variable or method `home_index_url' for #<HomeControllerTest:0x67df790>
test/controllers/home_controller_test.rb:5:in `block in <class:HomeControllerTest>'
bin/rails test test/controllers/home_controller_test.rb:4
这是home_controller_test.rb:
require 'test_helper'
class HomeControllerTest < ActionDispatch::IntegrationTest
test "should get index" do
get home_index_url
assert_response :success
end
end
对于可能出现的问题的任何帮助将不胜感激。
添加帖子索引视图:
<% @posts.each do |post| %>
<div class="post">
<h2 class="title"><%= link_to post[:title],post %></h2>
<div class="entry"><%= post[:body] %></div>
</br>
<div class="byline">
<span class="meta"><%= post[:created_at].strftime("%b %d, %Y") %> Posted By: <%= post.admin_user.name %></span><span class="links"><%= link_to "Read More",post %>
</div>
</div>
<% end %>
答案 0 :(得分:0)
更新(2017年5月10日)
您的帖子模型的admin_user_id主要是指Post属于AdminUser。
您的开发rails应用程序不会触发错误,因为它始终为每个帖子链接AdminUser。但是在测试环境中,您需要在test / fixtures文件夹下设置数据库数据。
在您的情况下,您需要在test / fixtures / admin_users.yml下创建一个AdminUser(例如adminUserOne),并将您的帖子与AdminUser相关联,如
postOne:
admin_user: adminUserOne
然后只有你的帖子链接了admin_user。
对于良好的做法,如果admin_user不存在,可能只是检查AdminUser的存在并提供不同的输出
<%= post.admin_user.present? post.admin_user.name : '-' %>
第一次出错
未定义的方法`name&#39;为零:NilClass
应用程序/视图/帖/ index.html.erb:7
错误消息指示错误位于上述视图文件的第7行。在引用您的视图文件内容后,它是由
引起的post.admin_user.name
在Post模型下,它与admin_user没有任何关系。 通常我们可以检查db / schema.rb中的关系或使用沙箱模式运行rails控制台
rails c --sandbox
然后尝试做类似
的事情Post.first.admin_user
观察控制台中会给出什么结果。
对于第二个错误,
home_index_url不是rails应用程序中的有效网址。
在rails 5中,您可以使用命令
rails routes -c home
找到任何相关路线。在我的申请中,我有这个结果
前缀
信息中心
根
所以我有dashboard_url和root_url。因此,在您的情况下,应该有前缀为home_index的路由,然后只能使用 home_index_url 。