2011-07-27 4 views
2

現在、handlebars.jsテンプレートを使用しているシステムで作業しています。しかし、ほとんどの場合、実際には存在しない属性を渡しているという問題があります。Rails Jsonにはカスタム値が含まれています

元はモデルが文字列をメソッドに渡すように設定していました。別の同僚は、関数が単に固定文字列リテラルを返すだけで、本当にロジックを実行していないので、悪い臭いがあると指摘しました(私はレールが初めてです)。しかし、私は他の方法でそれを行う方法を理解できませんでした。

最終的には、それが本質的にネストされた属性につながったビューを通じて、それをjsonに追加することができました。

問題は、文字列がデータにネストされていないため、ページに別のフォームテンプレートを追加しようとすると、この方法でハンドルバーを実行できなくなることです。私はデータにそれを入れ子にすることができますが、テンプレートは2つの場所で使用されているので、テンプレートの複製を作成する必要があります。私はまた、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 %> 

{{ 'sはハンドル変数を示します

はここにいくつかのサンプルコードです。 は、ここでビューのコード

<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

申し訳ありませんが、私はその質問を理解していません。 Apparntly、私は唯一ではない。あなたはもっと真直ぐでなければなりません。 – apneadiving

+0

ええ、本当に長いことをお詫び申し上げます。私はおそらくそれをもっとよくまとめたかもしれません。 – Micharch54

答えて

2

2つの異なるクラス(UpdateHighlight)の場合は、テンプレート内で何とかmodel.class.nameにアクセスできる場合があります。 Ruby/Railsには、クラスの名前を取得するためのイントロスペクションがいくつか用意されています。

名前を取得したら、ヘルパーなどを使用して複数の名前を付ける/大文字にすることができます。助けてくれますか?あなたのフォームはモデルに基づいている場合も

、代わりに、フォームのパーシャルにJSONデータで送信してhandlebars.jsを使用して、あなたは常にフォームがf.model.…を使って、上のベースをあるモデルを参照することができます。

+0

私はそれについて考えましたが、私はそれについて明確な構文を見つけることができませんでした。しかし、感謝します!ありがとう! – Micharch54

+0

+1 Rosetta stone discoveryの場合 – apneadiving

+0

その構文( 'model.class.name')が間違っているかどうかを教えてください。それは私の頭の上にあります。 –

関連する問題