Ruby on Rails:用户#show中的NoMethodError

时间:2014-09-09 21:14:02

标签: ruby-on-rails ruby rails-activerecord

我知道这是一个常见的错误,可以通过研究(我已经完成)来解决,但是,当我的代码似乎全部有序时,我似乎无法弄清楚为什么我的应用程序会破坏。我希望一些额外的眼睛能让我超越这个。

我得到的错误是NoMethodError in Users#show undefined method []为nil:NilClass`

提前致谢

型号:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable

         has_many :posts, dependent: :destroy


  def self.find_or_create_from_auth_hash(auth_hash)
    find_by_auth_hash(auth_hash) || create_from_auth_hash(auth_hash)
  end

  def self.find_by_auth_hash(auth_hash)
    where(
        provider:   auth_hash.provider,
        uid:        auth_hash.uid
        ).first
  end

  def self.create_from_auth_hash(auth_hash)
    create(
        provider:         auth_hash.provider,
        uid:              auth_hash.uid,
        email:            auth_hash.info.email,
        name:             auth_hash.info.name,
        oauth_token:      auth_hash.credentials.token,
        oauth_expires_at: Time.at(auth_hash.credentials.expires_at)
        )
  end

  def password_required?
    super && provider.blank?
  end

  def update_with_password(params, *options)
    if encrypted_password.blank?
        update_attributes(params, *options)
    else
        super
    end
  end

  def facebook
    @facebook ||= Koala::Facebook::API.new(oauth_token)
  end

  def get_profile_info
    self.facebook.get_object("me")
  end

  def get_location
    h = get_profile_info["location"]
    h ["name"]
   end

  def get_books
    self.facebook.get_connection("me", "books")
  end

  def get_profile_picture
    self.facebook.get_picture(uid)
  end

end

查看:

<div class="container">
    <div class="row">
        <div class="col-lg-4">
            <div class="media">
                <%= image_tag @user.get_profile_picture, class: "pull-left" %>
                <div class="media-body">
                    <h4 class="media-heading"><%= @user.name %></h4>
                    from <%= @user.get_location %>
                </div>
            </div>
            <hr />
            <div class="books">
                <% @user.get_books.each do |book| %>
                <p><%= book["name"] %></p>
                <% end %>
        </div></div>

        <div class="col-lg-6">
            <% @users.posts.order("created_at DESC").each do |post| %>

            <div class="post">

                <h5><%= post.title %></h5>
                <p><%= post.content %></p>

                <span class="pull-right label label-info"><%= time_ago_in_words(post.created_at) %> ago</span>

                <% if post.user == current_user %>
                <span class="pull-left"><%= link_to 'edit', edit_post_path(post), class: "btn btn-xs btn-primary" %> <%= link_to 'destroy', post, class: "btn btn-xs btn-danger", method: :delete, data: {confirm: 'Are you sure?'} %></span>
                <% end %>
            </div>
            <% end %>
        </div>
    </div>
</div>

控制器:

class UsersController < ApplicationController
    before_action :set_user, only: [:show]
    def index
        @users = User.all
    end

    def show
    end

    private

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

2 个答案:

答案 0 :(得分:1)

我间谍三名候选人。

模特中的两个

def get_location
    h = get_profile_info["location"] # <-- here
    h ["name"] # <-- here (most likely)
 end

视图中的一个

<% @user.get_books.each do |book| %>
    <p><%= book["name"] %></p> <!-- <-- here -->
<% end %>

访问过的Facebook数据可能在其中一个地方为零。

答案 1 :(得分:1)

我认为

Jesse是正确的,但更重要的是,还有其他一些问题需要解决


<强>变量

您提供了我认为是show视图

的内容

这里的问题是您调用了两个实例变量:

<% @user.each ... %>

<% @users.posts.order("created_at DESC").each do |post| %>

修复[]问题后,无疑会遇到对未定义变量@users的引用。要解决此问题,您需要在控制器中设置@users变量,或者只引用@user(唯一的设置变量)


<强>错误

您发布的错误指向[]对您调用的各种数据无效。

Jesse做出了正确的引用(关于错误可能存在的位置)

“修复”将使数组引用成为条件,或者确保您有备份数据(IE将FB数据放入数据库中)。

以下是确定条件的方法:

#app/views/users/show.html.erb
<% if @user.get_books.any? %>
   <% @user.get_books.each do |book| %>
      <%= book["name"] %>
   <% end %>
<% end %>

<%= @user.get_location % if @user.get_location.any? %>