我有一个我正在渲染的页面,看起来会有所不同,具体取决于谁在查看它。我的两个选项是:1)使用一些ifs
仅显示相关信息; 2)根据用户的身份从我的控制器渲染两个不同的视图。
为了保持DRY,我不想只渲染两个完全独立的页面。相反,我更喜欢我呈现的每个页面都引用一些常见的部分。
例如:
选项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
得到以下结果:
因此看起来渲染部分非常慢。
思想?
Rails 4.1.5 红宝石2.1.2
修改1:忘记在| Hello
_if_clause.slim
行
答案 0 :(得分:3)
您的基准测试不是在比较相同的功能。 _render一个用字符串渲染1000个部分,_if_clause仅在比较时进行。你应该比较,例如具有内联通知处理的模板呈现和在部分中执行通知处理的模板。
但即使部分渲染速度要慢得多,另外要考虑的是,它是否重要?如果代码更容易理解,则可能值得牺牲一些毫秒的查看时间。