我目前正在努力处理这段代码
@play = current_user.playlist.find_by_id(params[:id])
是什么current_user.playlist.find_by_id()
意思?如何跟踪此代码以找到 current_user、播放列表和 find_by_id() 函数?
我目前正在努力处理这段代码
@play = current_user.playlist.find_by_id(params[:id])
是什么current_user.playlist.find_by_id()
意思?如何跟踪此代码以找到 current_user、播放列表和 find_by_id() 函数?
您可能正在使用设计,如果是这种情况,则current_user
返回一个类的实例,该实例User
是当前登录的用户。或者nil
,如果没有登录用户。
playlist
是在 class 中定义的方法User
,您应该在 中找到此类app/models/user.rb
,通常此方法将定义为:
has_one :playlist
或者:
belongs_to :playlist
find_by_id
是 Rails 为 class 定义的方法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
.
在 Ruby 中,一切都是对象,对象有方法。对象也有类型。
您的顶级对象存在current_user
. 这是某个类的一个实例——您可以通过查看current_user.class
. 我怀疑你会发现它是User
.
所以,你会找到你User
的定义。这可能是一个模型,定义在app/models/user.rb
. 该模型将指定许多属性和关联。在这种情况下,您可能有has_many :playlists
关联。User
这样做是在一个实例和多个实例之间建立关联Playlist
。给定一个用户实例,user_instance.playlists
访问此关联。您的Playlist
模型将有一个user_id
将播放列表与用户记录相关联的字段。您可以在相关文档中阅读有关关联的更多信息。
最后,这个关联将有许多来自 Rails 的方法。ActiveRecord 有一组标准的查找器,以及一些“神奇”的查找器,例如find_by_id
,它们根据方法名称推断要从中查找的字段。find_by_id(params[:id])
在功能上等价于类似的东西find_by(:id => params[:id])
,但它的英语更多一些。您可以在文档的动态查找器方法中阅读更多相关信息。
find_by_id
将生成必要的 SQL 来查找具有该 ID 且也具有user_id
匹配ID 的播放列表记录current_user
。如果它找到匹配的记录,它将用它检索到的数据实例化一个播放列表记录并返回它。如果没有找到匹配的记录,它将返回 nil。