nil的未定义方法`profile':NilClass Rails

时间:2016-03-04 01:09:57

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

我经常陷入困境。我在用户,友谊和个人资料模型之间有很多关系。似乎没有什么对我有用,我有点沮丧。请有人帮帮我吗?

错误发生在这段代码中

<%= friendship.friend.profile.name %>

错误消息是:

block in _app_views_users_show_html_erb__2756270183135360761_70272652488180

_app_views_users_show_html_erb__2756270183135360761_70272652488180

在我的users / show.html.erb

    <h4> <%= current_user.profile.name%> Friends</h4>
         <ul>
           <% for friendship in @user.friendships %>
            <li>
              <%= friendship.friend.profile.name %>
              (<%= link_to "remove", friendship, :method => :delete %>)
           </li>
          <% end %>
        </ul> 

在user.rb模型中

has_many :friendships
has_many :friends, through: :friendships
has_one :profile

在friendship.rb模型中

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => 'User'
  belongs_to :profile
end

在profile.rb模型中

class Profile < ActiveRecord::Base

 belongs_to :user
 has_many :friendships
 has_many :friends, through: :friendships
end

在routes.rb

Rails.application.routes.draw do

 devise_for :users, :controllers => { registrations: 'registrations' }
 resources :users do
   resource :profile
 end
 resources :friendships
end

在users_controller.rb

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

end

2 个答案:

答案 0 :(得分:1)

您的current_user正在评估为nil,因此它试图将配置文件设置为nil。所以你必须处理

答案 1 :(得分:1)

你说应用程序中只有两个用户并且他们都是朋友,但根据你在Zaid的回答的评论中发布的User.last.friendships的控制台输出,有3个不同的用户ID( 6,2和5)。从您不再存在的用户看来,您的联接表中存在一个幽灵友谊残余。这会导致你得到的错误。

因为当您尝试在profile上呼叫friend时发生错误,我认为丢失的用户是2或5。

您应手动删除错误的友情,并在用户模型中的dependent: :destroy之后添加has_many :friendships,以避免日后重复此问题。