Как можно перебрать параметры формы с переменными ключами в Sinatra и Dust.js? - PullRequest
0 голосов
/ 29 февраля 2012

Я использую 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>

И вот здесь я застрял,Даже если я создам переменную экземпляра в контроллере и передам ей все значения параметров, я все еще не уверен, как синхронизировать итерацию как для переменных {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 Ответ

2 голосов
/ 02 марта 2012

Я отвечу на свой вопрос, на случай, если он пригодится кому-то еще. По сути, контроллер должен передать значения (в правильном порядке) представлению, тогда 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] );
    }
});
...