用户中的NoMethodError#show / undefined method#friendships for#<profile:0x007ff052f60b68> Rails

时间:2016-03-03 23:35:40

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

我无法弄清楚为什么我会收到这个错误....今天早些时候这个工作正常,然后我做了一些修改,我明显失去了轨道,现在当我启动我的应用程序时我总是尝试以用户身份登录时收到此错误。

NoMethodError in Users#show
undefined method `friendships' for #<Profile:0x007ff052f60b68>

我的应用中有3个用户,他们都有个人资料。

在current_user个人资料页面上,用户可以看到他的朋友,点击他们的名字查看他们的个人资料。

任何人都可以帮我吗? TIA Dadi

在views / users / show.html.erb

<h4> <%= current_user.profile.name%> Friends</h4>
         <ul>
           <% @user.friendships.each do |friendship| %>
           <li>
           <%= link_to user_profile_path(user), :method => :get do %>
           <%= friendship.friend.profile.name %>
           <%#= link_to compare_friends_path(@user), :method => :get do %>
           <%#= friendship.friend.profile.name %>
           (<%= link_to "remove friend", friendship, :method => :delete %>)
           </li>
          <% end %>
          <% end %>
         </ul> 

在users_controller.rb

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

end

在user.rb模型中

has_many :friendships
has_many :friends, through: :friendships
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
has_many :inverse_friends, through: :inverse_friendships, :source => :user

has_one :profile

在profiles_controller.rb

def show
    @user = User.find(params[:user_id])
    #@profile = @user.profile

end

在profile.rb模型中

class Profile < ActiveRecord::Base

belongs_to :user

end

在friendship.rb模型中

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

end

在routes.rb

   Rails.application.routes.draw do

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

  resources :friendships
 end

EDITED

在同一视图中我链接到相同的路线并且它有效,为什么会这样?我的意思是这基本上是相同的链接? (见下文)

          <h3>followers <%= current_user.profile.name%> </h3>
         <ul>
          <%  @user.inverse_friends.each do |user| %>
          <%= link_to user_profile_path(user), :method => :get do %>
            <li><%= user.profile.name %></li>
          <% end%>
          <% end %>
          </ul>

1 个答案:

答案 0 :(得分:0)

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

这似乎是错误的,因为您正在将User.profile分配给@user

这可以解释错误undefined method 'friendships' for #<Profile:0x007ff052f60b68>,因为User模型有has_many :friendships,但Profile没有。

注意:使用web_consolebetter_errors可以真正帮助追踪此类问题,并且非常值得花一些时间进行设置。您在浏览器中获得了一个异常的Ruby控制台,只需键入@user就会告诉您这是一个Profile实例,而不是User实例。

  

我做了一些修改,我明显失去了轨道

另一个教训:尽可能少地改变, TEST ,尽可能少地改变, TEST ,并不断重复这一点。这样,如果出现问题,您就会确切地知道哪些更改导致了错误。保持此反馈循环尽可能短。这也是better_errors等工具真正有帮助的地方。

有关更深入的说明,请参阅Feedback Loops in Software Development