【发布时间】:2018-08-19 08:33:45
【问题描述】:
重要背景:
我正在构建一个渐进式网络应用程序。例如,new 操作可能包含一系列步骤,其中每个步骤都有一个清晰、离散的页面,专门用于该步骤:
- 查找您要订购的商品(一些有用的指南)
- 将其带到结帐点(一些有用的指南)
- 看看它(一些有用的指南)
- 出门时锁门
所有页面共享一个具有一些通用功能的布局(例如,每个步骤上的下一步/后退按钮)。这个想法是页面视图看起来像这样:
<div id="step-1">
<div id="step-2" class="hidden">
<div id="step-3" class="hidden">
<div id="step-4" class="hidden">
每个步骤中都有下一步/后退按钮,其中隐藏/取消隐藏其他页面的 javascript。用户从来不需要提交任何东西,它实际上只是引导用户完成一系列步骤,而无需将他们重定向到多个控制器操作(和单独的视图文件),这会增加加载时间。
我正在尝试找出组织视图代码的策略。对我来说最有意义的是这样的
views
layouts
progressive_layout.html.erb
orders
new
step_1.html.erb
step_2.html.erb
step_3.html.erb
step_4.html.erb
上面的内容对我来说非常干净,我觉得它最容易管理,知道在哪里编辑。对于其他上下文,之前,我只有一个文件,在控制器中,我基本上有大量可笑的实例变量来定义视图文件中的各种内容。那行不通。
问题是,通过单个操作,我如何才能真正渲染它?显然我不能执行以下操作(因为每个操作只能调用一次 render):
def new
4.times do |i|
render "orders/new/step_#{i}", layout: "progressive_layout"
end
end
唯一真正的方法是将多次推送到progressive_layout
<% 4.times do |i| %>
<!-- generic content -->
<%= render "orders/new/step_#{i}" %> <!-- partialize the unique content -->
<!-- generic content -->
<% end %>
但这仍然很笨拙,因为progressive_layout 再次用于可能多于/少于 4 步的其他操作。本质上,我想找到一种非常干净的方法,允许单个操作构建 X 数量的“布局唯一内容”对。
这可能吗?
如果不是,我在想我可能需要做的是让控制器只渲染第一步,然后下一个按钮将 AJAX 提交给另一个控制器操作,该操作会拉动正确的下一步进行渲染。
【问题讨论】:
-
不不不。从服务器中删除客户端层。为什么人们仍然使用模板???客户端可以完全构建自己的用户端。从你的服务器上卸载所有计算。
-
Wicked 会做你需要的吗?
-
@Darkrum 你能提供一个示例答案吗?
-
@jljohnstone 感谢您的提示!检查出来了!据我所知,wicked的每一步都是新的要求吧?在我的情况下,这些步骤就像......表面,它们只是文本说明,所以我只希望 JS 隐藏/显示每个步骤,而不是实际有一个新请求
标签: javascript ruby-on-rails layout view render