2

我目前正在努力处理这段代码

@play = current_user.playlist.find_by_id(params[:id])

是什么current_user.playlist.find_by_id()意思?如何跟踪此代码以找到 current_user、播放列表和 find_by_id() 函数?

4

2 回答 2

4

您可能正在使用设计,如果是这种情况,则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.

于 2013-07-10T05:14:36.740 回答
1

在 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。

于 2013-07-10T05:30:51.020 回答