从控制器传递一个表到视图 - Rails

时间:2013-08-03 00:44:17

标签: ruby-on-rails templates variable-assignment

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

def list
    @persons = Person.all
end

但是,在人员视图的list.html.erb文件中,我无法访问此arrey。试着写下这样的东西: <%@ persons.each do | r | %GT; 提出错误声称@person为零。

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

3 个答案:

答案 0 :(得分:0)

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

您还可以查看此帖子以确保正确使用控制台: how to add data to database from rails console

***************** EDIT *******************

要使用索引列出显示模型列表,请打开routes.rb文件并添加人员资源以生成人员模型的所有路径

resources :people

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

resources :people, only: index

然后,您需要更新控制器以匹配您要使用的每个路由。因此,而不是列出'你可以使用索引,显示,编辑,更新,创建和销毁。

def index
  @people = Person.all
end

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

答案 1 :(得分:0)

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

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

祝你好运!

答案 2 :(得分: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