我的Writer类上有一个使用已定义的实例方法?运算符检查并查看是否定义了published_posts:
def performance_score
logger.debug posted_posts
logger.debug defined?(posted_posts)
unless defined?(posted_posts)
...
else
...
end
end
在我的控制器中,我有一个如下定义的编写器实例:
@writers = Writer.select("writers.*, p.total_posts, p.posted_posts").joins(...)
当我调用@ writers.performance_score时,从第一个logger.debug行开始,它说我有4个posted_posts,但第二个打印出来没有。此外,它进入除非部分而不是其他部分。
为了测试这个,我将published_posts存根到4.这从第一个logger.debug行输出4,第二个logger.debug表示它被定义为方法。此外,它确实进入了其他地方。
你能帮我理解为什么我的Rails应用程序失败了吗?
答案 0 :(得分:2)
实际上可能会失败,因为从您的AREL select
语句返回的关系使用method_missing
magic来从调用中返回一个值。这与defined
不同。当您在测试对象上模拟/存根“方法”时,可能正在使用创建已定义函数的define_method
函数。
这可能会做你想要的。
if respond_to?(:posted_posts)
...
else
...
end
答案 1 :(得分:0)
在查询AR abject之后不要使用相同的变量名,
@results = @writers.select("writers.*, p.total_posts, p.posted_posts")
然后在控制器中调用@results.performance_score