RoR - 在视图控制器变量中访问

时间:2012-08-20 18:02:03

标签: ruby-on-rails variables

我正在尝试从我的数据库中创建项目列表。问题是我无法在我的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>

2 个答案:

答案 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行移至索引操作。然后它会工作。尽量遵循指南,以后会为你节省大量的工作......