【发布时间】:2015-10-26 00:43:49
【问题描述】:
我有一个正在渲染的页面,根据查看者的不同,它看起来会略有不同。我的两个选项是 1) 使用一些 ifs 仅显示相关信息和 2) 根据用户是谁从我的控制器呈现两个不同的视图。
为了保持干燥,我不想只渲染两个完全独立的页面。相反,我希望我呈现的每个页面都引用一些常见的部分。
例如:
选项 1
view.slim
h1 Notifications
- if current_user.student.id == params[:id]
= link_to 'Edit', ...
- @notifications.each do |note|
# some stuff
h1 Activity
- if current_user.student.id == params[:id]
= link_to 'Edit', ...
- @activities.each do |note|
# some stuff
#etc...
选项 2
current_user_view.slim
= render 'notifications_header
= link_to 'Edit', ...
= render 'notifications'
= render 'activities_header
= link_to 'Edit', ...
= render 'activities'
other_user_view.slim
= render 'notifications_header
= render 'notifications'
= render 'activities_header
= render 'activities'
_notifications.slim
- @notifications.each do |note|
# some stuff
哪种方法更有效?
基准测试
以下是我对以下各项进行的一些基准测试:
_render.slim
- 1000.times do
= render 'foo'
_foo.slim
| Hello
_if_clause.slim
- 1000.times do
- if current_user.student.id == params[:id]
| Hello
结果如下:
所以看起来渲染局部非常慢。
想法?
导轨 4.1.5 红宝石 2.1.2
编辑 1:忘记在 _if_clause.slim 中添加 | Hello 行
【问题讨论】:
-
我同意你的担忧......我有一个案例需要渲染嵌套树(acts_as_nested_tree)......每个人,甚至是文档,都表示我应该使用递归,渲染相同的部分一次又一次..我讨厌它。我最终在视图级别编写了一个递归函数,并在那里做所有事情......效率更高......从应用程序树或缓存呈现部分所需的磁盘访问时间......递归和编码在内存中完成所有事情,所以它应该更快,尤其是在处理大规模重复时......
-
欢迎来到 Stack Overflow。与其说“编辑 1:”,不如将变化自然地融入问题中。如果每个问题都受到质疑,我们可以看到您在哪里更改了问题,并且通过混合它,您的问题将更有意义。此外,与其提供图像来向我们展示文本,不如简单地复制/粘贴并在您的问题中格式化以提高可读性。指向外部站点/来源的链接总是会腐烂和中断,从而在问题中留下空白和无意义的部分。如果您想进行基准测试,请使用 Ruby 的内置 Benchmark 类或使用 Fruity gem。我推荐后者,因为它更容易使用。
-
@theTinMan 嘿,感谢您的提示!我最初使用 Ruby 的 Benchmark 类。此数据来自
rack-mini-profilergem,因为我也想实际获取页面加载时间。
标签: ruby-on-rails ruby if-statement partial-views benchmarking