在Rails中跟踪代码时遇到问题

时间:2013-07-10 05:08:42

标签: ruby-on-rails ruby ruby-on-rails-3

我目前正在努力解决这段代码

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

current_user.playlist.find_by_id()是什么意思?如何跟踪此代码以查找current_user,playlist和find_by_id()函数?

2 个答案:

答案 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。