Rails Json包含自定义值

时间:2011-07-27 16:19:24

标签: javascript ruby-on-rails

我目前正在使用一个使用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

这么糟糕的情况?

1 个答案:

答案 0 :(得分:2)

如果他们是两个不同的类(UpdateHighlight),您可能会以某种方式访问​​模板中的model.class.name。 Ruby / Rails提供了一些内省,允许您获取类的名称。

一旦你拥有了这个名字,你就可以通过帮助者或其中的多元化/大写的东西来运行它。那会有帮助吗?

此外,如果您的表单基于模型,而不是使用handlebars.js将JSON数据发送到表单部分并且使用handlebars.js,您可以始终使用表单基于来引用模型f.model.…