我正在尝试从我的数据库中创建项目列表。问题是我无法在我的view / user / index.html.erb中访问我的users_controller方法中的变量(数组)。我一直在阅读书籍和书籍,但他们告诉我在途中某处碾碎的方式。任何提示/帮助表示赞赏,谢谢。
控制器:
class UsersController < ApplicationController
def index
render('list')
end
def list
@users = User.all
end
def show
@user = User.find(params[:id])
end
def new
@user = user.new
end
def create
@user = User.new(params[:user])
if @user.save
flash[:notice] = "User succesfully created!"
redirect_to(:action => 'list')
else
flash[:notice] = "User couldn't be created!"
render('new')
end
end
end
list.html.erb
<table>
<tr>
<td>
<th>Name
</td>
<td>
<th>Password
</td>
<td>
<th>Log status
</td>
<td>
<th>Warning
</td>
<td>
<th>Banned
</td>
</tr>
<% @users.each do |u| %>
<tr>
<td><%= u.name %></td>
<td><%= u.password %></td>
<td><%= u.log_status %></td>
<td><%= u.warning %></td>
<td><%= u.banned %></td>
</tr>
<%end%>
</table>
错误:
NoMethodError in Users#index
Showing /home/bogdan/ex/lynda/hW/app/views/users/list.html.erb where line #20 raised:
undefined method `each' for nil:NilClass
Extracted source (around line #20):
17: </td>
18: </tr>
19:
20: <% @users.each do |u|%>
21:
22: <tr>
23: <td><%= u.name %></td>
答案 0 :(得分:2)
因为您在没有使用变量的情况下渲染视图:
快速解决方案:
在索引操作中添加此项,然后点击重新加载:
@users = User.all
详细解答:
这两种方法是动作(执行光标)去另一个地方,无论是视图还是动作。它意味着将控制转移到一个地方到另一个地方。这些是干原理的例子,但用途不同。
“RENDER:”
渲染与仅渲染视图的那一部分而不实际再次运行该方法有关。这意味着如果我们使用渲染方法,它会转到相应的视图,因此它不会带有任何请求进入服务器,所以它很快。但它使用该方法中的数据意味着它从中呈现的位置。 渲染也用于文本,布局,文件,模板。
“REDIRECT:”
重定向实际上会将您带到页面并从头开始。当我们调用redirect_to方法时,它将转到该特定方法 ,这意味着此请求转到服务器,然后转到方法并执行它 例如:示例
def update
@product= Product.find(params[:id])
if @product.update_attributes(params[:name])
redirect_to :action => 'list_users'
else
render :edit
end
end
说明:
以上示例如果名称更新转到list_users方法,则返回编辑视图。如果更新了用户名,则转到列出用户并显示用户及其值的列表,如果没有返回编辑,如果没有更新数据原因任何验证或任何事情回来查看
答案 1 :(得分:0)
嗯,Mohit给出了正确的答案,但我认为对新手用户来说可能太难理解了。
他想告诉你的是,'render'语句只会处理views / users / list.html.erb。它不会调用另一个函数(def列表),因此你的变量@users从未被初始化。
要遵循指南,请删除“def list”,并将@users = User.all行移至索引操作。然后它会工作。尽量遵循指南,以后会为你节省大量的工作......