比较Mustache块循环中的数组值

时间:2011-09-19 22:06:24

标签: ruby arrays sinatra mustache

所以我试图使用Mustache和Sinatra从数组中渲染一个选择下拉列表。模板代码目前如下所示:

<select id="phone_prefix" name="phone_prefix">
    {{#prefixes}}
        <option value="{{to_s}}" {{selected}}>{{to_s}}</option>
    {{/prefixes}}
</select>

在视图中使用以下方法渲染数组的每个项目:

def prefixes
  ["03", "04", "06", "07", "09", "021", "022", "025", "027", "028", "029"]
end

对于mustache模板中的{{selected}}值,我需要对当前正在迭代的数组项进行比较,并通过params[:phone_prefix]进行查询字符串值,例如"09" }。然后,当匹配时,将"selected"的值返回到selected方法以传递给小胡子。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

将逻辑推入Ruby并将数据提供给Mustache。更新您的prefixes方法以返回哈希数组:

def prefixes
  # figure out which one is selected by asking params...
  [ { :n => '03', :selected => false }, { :n => '04', :selected => true }, ... ]
end

然后在你的模板中出现类似内容:

<select id="phone_prefix" name="phone_prefix">
    {{#prefixes}}
        <option value="{{n}}" {{#selected}}selected="selected"{{/selected}}>{{n}}</option>
    {{/prefixes}}
</select>

我在JavaScript中只使用过Mustache,所以我可能会遗漏Ruby中的一些东西但是接近它的东西应该有效,你只需要从params获取信息到你的prefixes方法中。

小胡子故意是简约的,没有逻辑,it even says so on the homepage

  

无逻辑模板。

所以你的所有逻辑都在你的代码中,你只需为Mustache设置一堆变量和标志即可。模板中唯一可用的逻辑是“这是真的吗?”并且“我可以迭代这件事吗?”;任何比这更复杂的事情都必须在为Mustache准备数据的代码中。

答案 1 :(得分:0)

Rad公司!谢谢!这是一种享受。我最终得到了以下前缀方法,它的效果非常好:

def prefixes
  prefix_list = [{:n => "03", :selected => false}, {:n => "04", :selected => false}, {:n => "06", :selected => false}, {:n => "07", :selected => false}, {:n => "09", :selected => false}, {:n => "021", :selected => false}, {:n => "022", :selected => false}, {:n => "025", :selected => false}, {:n => "027", :selected => false}, {:n => "028", :selected => false}, {:n => "029", :selected => false}]
  prefix_list.each do |i|
    if i[:n] == "09"
      i[:selected] = true
    end
  end
  prefix_list
end