我目前正在努力解决这段代码
@play = current_user.playlist.find_by_id(params[:id])
current_user.playlist.find_by_id()
是什么意思?如何跟踪此代码以查找current_user,playlist和find_by_id()函数?
答案 0 :(得分:4)
您可能正在使用设计,如果是这种情况,current_user
将返回当前登录用户的类User
的实例。如果没有登录用户,请nil
。
playlist
是在类User
中定义的方法,您应该在app/models/user.rb
中找到此类,通常此方法将定义为:
has_one :playlist
或:
belongs_to :playlist
find_by_id
是Rails为类User
定义的方法,您不会直接在文件中看到这个。它是在你有这样的东西时创建的:
class User < ActiveRecord::Base
ActiveRecord::Base
创造了更多方法。
我会打印句子的每一部分
p current_user
p current_user.playlist
p params[:id]
p current_user.playlist.find_by_id(params[:id])
并在我的服务器控制台中检查结果,您可以发现其中哪一个是第一个nil
。
答案 1 :(得分:1)
在Ruby中,一切都是对象,对象有方法。对象也有类型。
您的顶级对象有current_user
。这是某个类的实例 - 您可以通过查看current_user.class
找到什么类型。我怀疑你会发现它是User
的实例。
因此,您可以找到User
的定义位置。这可能是app/models/user.rb
中定义的模型。该模型将指定许多属性和关联。在这种情况下,您可能会有has_many :playlists
关联。这样做是在User
实例和许多Playlist
实例之间建立关联。给定用户实例,user_instance.playlists
访问此关联。您的Playlist
模型将有一个user_id
字段,用于将播放列表与用户记录相关联。您可以阅读有关关联in the relevant documentation的更多信息。
最后,这个关联将有许多来自Rails的方法。 ActiveRecord有一组标准的查找程序,以及一些“魔术”查找程序,如find_by_id
,它根据方法名称推断要查找的字段。 find_by_id(params[:id])
在功能上等同于find_by(:id => params[:id])
,但它更像英语。您可以在the documentation的动态查找器方法中阅读有关此内容的更多信息。
find_by_id
将生成查找具有该ID的播放列表记录所必需的SQL,该ID也具有user_id
匹配的current_user
ID。如果找到匹配的记录,它将使用它检索的数据实例化一个播放列表记录并将其返回。如果未找到匹配的记录,则返回nil。