0

我正在尝试从我的数据库中创建项目列表。问题是我无法在我的视图/用户/index.html.erb 中访问来自 users_controller 方法的变量(数组)。我一直在阅读 tuts 和书籍,但他们告诉我要在路上的某个地方迷恋的方式。任何提示/帮助表示赞赏,谢谢。

控制器:

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>
4

2 回答 2

2

因为您正在渲染视图而没有在其中使用变量:

快速解决方案:

将此添加到您的索引操作中,然后点击重新加载:

 @users = User.all

详细解答:

这两种方法是动作(执行光标)转到另一个地方,无论是视图还是动作。这意味着将控制权转移到另一个地方。这些是干式原理的示例,但用途不同。

“使成为:”

渲染与仅渲染视图的那部分而不实际再次运行该方法有关。这意味着如果我们使用渲染方法,它会转到相应的视图,因此它不会向服务器发送任何请求,因此速度很快。但它使用该方法中的数据意味着它从哪里渲染。渲染也用于文本、布局、文件、模板。

“重定向:”

重定向实际上将您带到页面并从头开始执行操作。当我们调用 redirect_to 方法时,它会转到那个特定的方法,这意味着这个请求会转到服务器,然后转到方法并执行它 Ex:Example

  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 方法,否则返回编辑视图。在此如果更新用户名然后转到列表用户并显示用户列表及其值,如果不更新数据则不返回编辑导致任何验证或任何东西回来查看

于 2012-08-20T18:09:02.543 回答
0

Hmm, Mohit gave the correct answer, but I think it might be too difficult to understand for a novice user.

What he want to tell you, that the 'render' statement will only process the views/users/list.html.erb. It will not call another function (def list), so your variable @users has never been initialized.

To go by the guidelines, remove your 'def list', and move the line @users = User.all to the index action. Then it will work. Try to follow guidelines as much as possible, it will save you lots of work later on...

于 2012-08-20T18:29:05.077 回答