0

在我的 Rails 站点中,我有一个名为 Person 的模型,它有一个 ActionController 和迁移(数据库)。我使用控制台在该表中插入了几行(并将它们保存在那里!)。在 PersonController 中,我有一个方法“list”,我想列出数据库中的所有人员:

def list
    @persons = Person.all
end

但是,在人员视图中的 list.html.erb 文件中,我无法访问此 arrey。尝试写类似: <% @persons.each do |r| %> 引发错误声明 @person 为 nil。

我想我在这里做错了什么。总之,如何将数据库从控制器传递到视图,以及如何显示它?谢谢

4

3 回答 3

0

您用于将数据从控制器传输到视图的方法是合适的。我的猜测是 Person.all 没有返回任何结果,这意味着您的数据库没有通过控制台填充。尝试通过 db 目录中的 seed.rb 添加数据,然后运行 ​​rake db:seed。那应该为你做。此外,通常模型列表通过“索引”路径运行。我建议使用它而不是路线“列表”。

您还可以查看这篇文章以确保您正确使用控制台: 如何从 Rails 控制台添加数据到数据库

*****************编辑*******************

要使用 index 列出模型列表,请打开您的 routes.rb 文件并添加人员资源以生成人员模型的所有路线

resources :people

这将为您提供索引、显示、编辑、创建、更新和销毁路由(运行 rake 路由以查看所有路由的列表)。如果您不想要所有这些,您可以使用 only: 和 except: 和 resource 命令来限制创建的路由。例子

resources :people, only: index

然后,您需要更新控制器以匹配您要使用的每个路由。因此,您可以使用索引、显示、编辑、更新、创建和销毁来代替“列表”。

def index
  @people = Person.all
end

是索引操作定义的示例。然后你只需要一个视图来匹配动作,比如 index.html.erb。如果您在数据库中有任何人,他们现在应该在索引操作期间位于 @people 变量中,您可以使用它来列出每个人。如果您想创建一些人来尝试一下,可以使用控制台,使用 routes.rb 中的资源命令创建的 show 操作,或使用 seed.rb 文件并运行 rake db:seed。

于 2013-08-03T00:50:01.970 回答
0

您在控制器中的变量是@persons而不是@person。您得到的错误是@person is nil. 如果这不是问题,那么请记住 rails 使用单数作为模型名称,Person在其他情况下使用复数people来命名表和控制器。

如果这没有帮助,请发布您的真实文件名、控制器的第一行以及其他相关代码。

祝你好运!

于 2013-08-03T01:02:30.817 回答
0

检查数据库并确保数据在那里。此外,当您通过控制台创建记录时,请确保使用 Person.create 而不是 Person.new。

Person.new 必须分配给一个变量,并且必须在该变量上调用 save。创建不需要额外的步骤

 u = User.new(:first => "Chris", :last => "Tilley")
 u.save! //required with new

 u = Person.create(:first => "Chris", :last => "Tilley")  //doesn't require save
于 2013-08-03T02:01:43.023 回答