0

データベースからアイテムのリストを作成しようとしています。問題は、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>
4

2 に答える 2

2

変数を使用せずにビューをレンダリングしているため、次のようになります。

迅速な解決策:

これをインデックスアクションに追加してから、リロードを押します。

 @users = User.all

詳細な回答:

これらの2つの方法は、アクション(実行カーソル)がビューであろうとアクションであろうと、別の場所に移動することです。これは、ある場所から別の場所に制御を移すことを意味します。これらはドライプリンシパルの例ですが、用途は異なります。

"与える:"

Renderは、実際にメソッドを再度実行せずに、ビューのその部分をレンダリングすることと関係があります。つまり、renderメソッドを使用すると、対応するビューに移動するため、リクエストでサーバーに移動しなかったため、高速になります。そのメソッドのデータは、どこからレンダリングされるかを意味します。text、layout、file、templateにも使用してレンダリングします。

"リダイレクト:"

リダイレクトは実際にページに移動し、最初から処理を実行します。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メソッドに移動し、それ以外の場合はビューの編集に戻ります。この場合、ユーザー名を更新する場合は、ユーザーのリストに移動し、ユーザーとその値のリストを表示します。更新しない場合は、データを更新しない場合は、検証の原因となります。または表示に戻るもの

于 2012-08-20T18:09:02.543 に答える
0

うーん、Mohitが正解しましたが、初心者のユーザーには理解しにくいかもしれません。

彼があなたに伝えたいことは、「render」ステートメントはviews / users/list.html.erbのみを処理するということです。別の関数(def list)を呼び出さないため、変数@usersは初期化されていません。

ガイドラインに従うには、「def list」を削除し、@ users=User.allという行をインデックスアクションに移動します。その後、それは動作します。可能な限りガイドラインに従うようにしてください。後で多くの作業を節約できます...

于 2012-08-20T18:29:05.077 に答える