我无法弄清楚为什么我会收到这个错误....今天早些时候这个工作正常,然后我做了一些修改,我明显失去了轨道,现在当我启动我的应用程序时我总是尝试以用户身份登录时收到此错误。
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>
答案 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_console或better_errors可以真正帮助追踪此类问题,并且非常值得花一些时间进行设置。您在浏览器中获得了一个异常的Ruby控制台,只需键入@user
就会告诉您这是一个Profile
实例,而不是User
实例。
我做了一些修改,我明显失去了轨道
另一个教训:尽可能少地改变, TEST ,尽可能少地改变, TEST ,并不断重复这一点。这样,如果出现问题,您就会确切地知道哪些更改导致了错误。保持此反馈循环尽可能短。这也是better_errors
等工具真正有帮助的地方。
有关更深入的说明,请参阅Feedback Loops in Software Development。