未定义的方法`每个'为nil:在Pages#friends中的NilClass

时间:2014-07-28 21:26:41

标签: ruby-on-rails ruby ruby-on-rails-4 undefined null

我试图让我的粉丝显示在页面/朋友上但是,我不断收到多个错误,例如 未定义的方法`每个' for nil:NilClass 在我的Pages#friends错误中。我正在关注关注/取消关注的Michael Harlts教程,但是,我需要调整一些事情,因为我没有遵循整个事情。

当用户访问他们的朋友链接(页面/朋友)时,我希望它显示关注他们的每个人。就像我的用户/索引显示每个人一样。请参阅下面的代码。任何建议的帮助都会很棒。

信息页/朋友

<h1>Friends</h1>

<% @user ||= current_user %>
 <% @users.each do |user| %>
     <center><%= link_to image_tag(user.avatar.url(:thumb)), user %></center>
     <strong><center><br><%= link_to user.name, user %></br></center></strong>
     <% if current_user.admin %>
 <% end %>
  <% end %>

信息页/控制器

  def home
  end

  def about
  end

  def friends
  end

end

**用户/指数*

<% provide(:title, 'All users') %>
<h1>All users</h1>

    <div class="col-md-offset-4 col-med-8">
        <div class="panel panel-default">
        <div class="panel-heading center">

  <% @users.each do |user| %>
     <center><%= link_to image_tag(user.avatar.url(:thumb)), user %></center>
     <strong><center><br><%= link_to user.name, user %></br></center></strong>
     <% if current_user.admin %>

  <% @user ||= current_user %>
      <div class="stats">
        <a href="<%= friends_path(@user) %>">
          <strong id="following" class="stat">
            <%= @user.followed_users.count %>
          </strong>
          following
        </a>
        <a href="<%= friends_path(@user) %>">
          <strong id="followers" class="stat">
            <%= @user.followers.count %>
          </strong>
          followers
        </a>
      </div>


 <center><%= link_to "Delete", user, method: :delete, data: { confirm: "Are you sure?" } %></center>
<% end %>
<% end %>

<div class="center">
<%= will_paginate @users, renderer: BootstrapPagination::Rails %>
</div>
</div>

路线

devise_for :admins
  devise_for :users

  resources :posts
  resources :users do
    member do
      get :following, :followers
    end
  end

  resources :relationships, only: [:create, :destroy]
  resources :user_friendships do 
      member do
        put :accept
      end
     end   

  get "users/show"


  root "pages#home"
  get 'feed', to: 'posts#index', as: :feed
  get "about" => "pages#about"
  get "friends" => 'pages#friends'


  match 'users/:id' => 'users#show', via: :get
  match 'users/:id' => 'users#index', via: :destroy


  match 'users/:id' => 'users#destroy', via: :get
  match 'users/:id' => 'users#destroy', via: :delete


  get '/:id', to: 'users#show'

用户/控制器

class UsersController < ApplicationController

  before_action :correct_user, only: [:edit, :update, :destroy, :following, :followers]
  before_action :authenticate_user!, except: [:index, :show]
  before_action :admin_user,     only: :destroy


  def index
    @users = User.paginate(page: params[:page], :per_page => 5)
  end


  def show
    @user = User.find(params[:id])

    if @user 

        @posts = @user.posts.all
        render actions: :show 
    else
        render file: 'public/404', status: 404, formats: [:html]
    end  

def destroy
    User.find(params[:id]).destroy
    flash[:success] = "Your account has been deleted."
    redirect_to root_path
  end

  def correct_user
      @user = User.find(params[:id])
      redirect_to root_path 
    end

  def admin_user
      redirect_to root_path unless current_user.admin?
  end


  def following
    @title = "Following"
    @user = User.find(params[:id])
    @users = @user.followed_users.paginate(page: params[:page])
    render 'show_follow'
  end

  def followers
    @title = "Followers"
    @user = User.find(params[:id])
    @users = @user.followers.paginate(page: params[:page])
    render 'show_follow'
  end

  end
end

关系控制器

class RelationshipsController < ApplicationController

  before_action :authenticate_user!, except: [:index, :show]


def create
    @user = User.find(params[:relationship][:followed_id])
    current_user.follow!(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end

  def destroy
    @user = Relationship.find(params[:id]).followed
    current_user.unfollow!(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end

end

2 个答案:

答案 0 :(得分:3)

错误undefined method 'each' for nil:NilClass表示您正在.each的对象上调用nil

例如,@users可能是nil

def index
  @users = User.paginate(page: params[:page], :per_page => 5)
end

如果您再致电<% @users.each ... %>,则会收到undefined method错误。您已经在上面发布了相当多的代码,因此很难确切地知道该错误被抛出的位置。尝试并确切地确定抛出错误的位置(发布堆栈跟踪会有所帮助),并找出哪个对象是nil。然后找出为什么nil - 没有数据?或者您的ActiveRecord查询没有返回结果?

希望这能为您提供一些关于从哪里开始寻找下一步的建议。

修改:正如mmichael指出的那样,错误是由于@userspages#friends未声明的事实造成的。谢谢!

答案 1 :(得分:1)

当你是新人时,我会给你另一个意见。我要写的内容类似于Sam的答案;我打算帮助您了解Rails如何工作,以进一步提升您的体验


<强>物件

你必须记住,Rails是建立在Ruby之上的 - object-orientated language。这意味着每次在Ruby中声明/使用variable时,您实际上都在访问对象,Ruby认为它具有一系列方法:< / p>

  

Ruby是纯面向对象的语言,一切都出现在Ruby中   作为一个对象。 Ruby中的每个值都是一个对象,甚至是最多的   原始的东西:字符串,数字甚至是真假。甚至一个   class本身是一个对象,它是Class类的一个实例。这个   本章将带您了解与之相关的所有主要功能   面向对象的Ruby。

我写这篇是因为Ruby的面向对象结构与处理“传统”意义上的变量有很大的不同 - 在最简单的描述中,它意味着Ruby假设对象总是存在(它只需从NilClass构建它们,允许您调用“空”数据集而不会遇到“未声明”问题

当您尝试在空/零对象上运行.each等方法时会出现问题。如果你这样做,就会出现你所提到的错误;阻止您执行您想要的功能

-

<强>修正

您的错误基本上意味着您尚未声明您的变量

看到你的代码后,最明显的问题就在这里:

#app/controllers/pages_controller.rb
Class PagesController < ApplicationController
   def friends
       # normally, you'd define your @instance_variables here
   end
end

我发现您的friends操作未声明您的@users变量,这是执行@users.each方法所必需的。根据{{​​1}}的建议,第一步是确保您能够声明此值,允许您根据需要循环它:

Sam