我目前正在使用一个使用handlebars.js模板的系统。然而,它在大多数情况下工作,问题是我们传递的是一个并不存在的属性。
最初我设置了它,以便模型通过方法传递字符串。另一位同事指出它有一种难闻的气味,因为函数只是返回一个固定的字符串文字,而不是真正做任何逻辑。(我是铁杆新手)。但是,我无法弄清楚如何以其他方式做到这一点。
我们终于设法通过视图将它附加到json,导致该属性基本上是嵌套的。
问题是当你尝试将另一个表单模板添加到页面时,这样做把手现在会失败,因为字符串没有嵌套在数据中。我可以将它嵌套在数据中,但我必须创建模板的副本,因为它在两个地方使用。我还必须复制javascript。
我的问题是,保持“轨道方式”,简化事情并回到模型只是传递固定字符串有多糟糕?它不是一个优雅的解决方案,但它在代码方面肯定更简单。
以下是一些示例代码:
<% fields_for :thing do |f| %>
<fieldset>
<div>
<div>
<input type="hidden" id="special_report_{{../type}}_attributes_{{sequence}}_id" name="special_report[{{../type}}_attributes][{{sequence}}][id]" value="{{id}}"/>
<input type="hidden" id="special_report_{{../type}}_attributes_{{sequence}}__destroy" name="special_report[{{../type}}_attributes][{{sequence}}][_destroy]" class="remove_flag" value="{{id}}"/>
<%= remove_child_link "remove", f %>
</div>
<p>
<span>Title: </span><br/>
<input type="text" id="special_report_{{../type}}_attributes_{{sequence}}_title" name="special_report[{{../type}}_attributes][{{sequence}}][title]" size="30" value="{{title}}"/>
</p>
<p>
<span>Date: </span><br />
<input id="special_report_{{../type}}_attributes_{{sequence}}_event_date" name="special_report[{{../type}}_attributes][{{sequence}}][event_date]" size="30" type="text" value="{{event_date}}"/>
</p>
<p>
<br />
<div>
<textarea id="special_report_{{../type}}_attributes_{{sequence}}_content" name="special_report[{{../type}}_attributes][{{sequence}}][content]">{{content}}</textarea>
</div>
</p>
</div>
</fieldset>
<% end %>
{{表示车把变量。 这是视图代码
<script>
var updates_data = {update_content: $j.parseJSON('<%= @update_json %>'),"type":"updates"}
var highlights_data = { highlight_content: $j.parseJSON('<%= @highlight_json %>'),"type":"highlights"}
</script>
<% form_for( @foo) do |f| %>
<div>
<div>
<b>Updates:</b>
<p>
<%= add_child_link "Add update", :updates %> #custom wrapper for a link to the template
</p>
<div>
<script id="updates-template" type="text/x-handlebars-template">
{{#each update_content}}
<%= new_child_fields_template(f, :updates)%>
{{/each}}
</script>
<script id="update-template" type="text/x-handlebars-template">
<%= new_child_fields_template(f, :updates)%>
</script>
</div>
</div>
<div>
<b>Highlights:</b>
<p><%= add_child_link "Add highlight", :highlights %></p>
<div id="highlights">
<script id="highlights-template" type="text/x-handlebars-template">
{{#each highlight_content}}
<%= new_child_fields_template(f, :highlights)%>
{{/each}}
</script>
</div>
</div>
</div>
<% end %>
模型中的方法只是
def type
"update"
end
我们从两个模型中提取更新和突出显示,它们都使用相同的表单模板。
我问,因为这些技术对我来说都是新手,我不确定哪种方法最好。提前谢谢。
编辑或TLDR
基本上我要问的是,将某些内容推送到视图或者使用如下方法更好:
def type
"update"
end
这么糟糕的情况?
答案 0 :(得分:2)
如果他们是两个不同的类(Update
和Highlight
),您可能会以某种方式访问模板中的model.class.name
。 Ruby / Rails提供了一些内省,允许您获取类的名称。
一旦你拥有了这个名字,你就可以通过帮助者或其中的多元化/大写的东西来运行它。那会有帮助吗?
此外,如果您的表单基于模型,而不是使用handlebars.js将JSON数据发送到表单部分并且使用handlebars.js,您可以始终使用表单基于的来引用模型f.model.…
。