gpt4 book ai didi

ruby-on-rails - 在 rails 中查看演示者

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:20 24 4
gpt4 key购买 nike

我最近看了瑞恩·贝茨 (Ryan Bates) 从零开始讲的一集节目,很好地解释了节目主持人的工作。这就是我指的:

http://railscasts.com/episodes/287-presenters-from-scratch

所以我决定重构一下我的一些观点,因为里面有一些非常复杂的逻辑。

我的应用程序中有一个页面显示用户列表及其图像等。所以我所做的是为每个用户呈现一个部分,这就是它的工作原理。

在与演示者一起重构后,我得到了相同的部分,但所有逻辑都移到了演示者之外, View 只显示了值,但是我注意到为每个用户渲染部分需要两倍的时间以前做过。

这是之前的(来自日志的数据):

Rendered users/_user_thumb.html.haml (6.4ms)

重构后:

Rendered users/_user_thumb.html.haml (18.5ms)

我查看了日志是否有一些额外的查询会触发什么,并且在重构代码时没有触发额外的查询。

我的问题是为什么这么慢?难道我做错了什么?

这是我的代码现在的样子:

 - @users.each do |user|
= render_partial "user_thumb", user: user

现在在渲染部分 user_thumb 中我有一个复杂的逻辑,但现在我有这个:

- present user do |user_presenter|
....mycode here

我用的是 haml。

问题更新

比利的回答有一些优点,所以我投了他的票。

我尝试了他的建议来装饰 Controller 中的 @users,例如:

@users = UserDecorator.decorate(users)

然后我尝试检查它,我看到类似的东西:

#<UserDecorator:0x0000000966a6f8 @object=[#<User id: 8112 .....some users ], @context={}>

这很好,因为我似乎可以立即装饰我的用户。然后我尝试了 Billy 的建议并做了:

= render partial: "user_thumb", collection: @users

但是当我在我的观点中尝试时:

collection.each do |u|
puts "#{user.inspect}"
end

我的装饰器看起来像:

class UserDecorator < Draper::Decorator
decorates :user
....
end

我得到的是用户而不是装饰用户,这是为什么?在装饰对象列表时这是如何工作的?如果最后你仍然得到用户对象,这样做的目的是什么?

这有效,但它真的很慢:

- @users.each do |user|
= render_partial "user_thumb", user: user.decorate

如何创建装饰器数组?

最佳答案

代码有几个地方需要改进。

首先,确保您的@users 在传递给 View 之前已经在 Controller 中进行了修饰。好处:

  1. 这样您根本不需要编辑原始模板,只需使用相同的@users

  2. 您的 View 与您使用的任何呈现/装饰模式都是分离的,而且确实有很多选择。您也可以选择不使用它来保持 View 不变。

  3. 理论上这应该更快,因为如果你在 View 中单独装饰项目,与批量处理相比,计算机需要一次又一次地加载相关模块。

其次,呈现一个集合而不是迭代 View 。根据我的经验,这会更快。

代替

- @users.each do |user|
= render_partial "user_thumb", user: user

= render partial: "user_thumb", collection: @users

关于ruby-on-rails - 在 rails 中查看演示者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22334510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com