如何在Sinatra和Dust.js中使用变量键迭代形式参数?

时间:2012-02-29 19:52:09

标签: ruby sinatra mustache

我正在使用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>

非常感谢任何帮助!

1 个答案:

答案 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] );
    }
});