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