我正在使用Sinatra和一个名为Dust.js的客户端模板(类似于Mustache)来构建一个简单的表单流。在初始状态下,表单标签通过JSON传递
{ "fields" : [ { "title" : "First Name", "name" : "fn" }, { "title" : "Last Name", "name": "ln" } ] }
由Dust解释:
{#fields} <label>{title}: <input type="text" name="{name}" /></label> {/fields}
这一切都很好。提交表单后,我想重用{title}
,但也使用{name}
作为键来迭代用户输入的值。什么是好的是能够写这样的东西 - 即使它在<%= params[] %>
之前评估{name}
之后不起作用:
<ul>
{#fields}
<li><b>{title}</b>: <%= params[{name}] %></li>
{/fields}
</ul>
这就是我被困住的地方。即使我在控制器中创建了一个实例变量并将其传递给了所有param值,我仍然不确定如何在{title}
变量和params.values
上同步迭代。
就我而言:
# controller
post '/submit' do
@v = []
params.values.each do |v|
@v << "#{v}"
end
erb :submit
end
<!-- view -->
<ul>
{#fields}
<% @v.each do |k| %>
<li><b>{title}</b>: <%= k %></li>
<% end %>
{/fields}
</ul>
非常感谢任何帮助!
答案 0 :(得分:2)
我会回答我自己的问题,以防它对那里的任何人都有帮助。基本上,控制器需要将值(以正确的顺序)传递给视图,然后Dust.js可以做到这一点。
# form.rb
post '/submit' do
# get/store list of input names to be used as keys
@v = ["firstname","lastname","address"] # ...and so on
@vn = []
params.keys.each_with_index do |v, i|
@vn << "#{params[ @v[i] ]}," # comma-delimited, since it's stored as a string in the view
end
erb :submit
end
<!-- submit.erb -->
<ul>
{#fields names="<%= @vn %>"}
<li><b>{title}</b>: {field_vals}</li>
{/fields}
</ul>
/* dust (js) */
var base = dust.makeBase({
field_vals: function(chunk, context) {
// convert string "names" to array
var names = context.get("names").split(',');
// ref with iteration index from context
return chunk.write( names[context.stack.index] );
}
});