2011-07-06 8 views
3

にJavaScriptコードを改善します私のビューファイル:は、私はRailsの3.0.7にルビーを使用していると私は私が<em>リファクタリング</em>、<em>DRY</em>(自分を繰り返してはいけない)と<em></em>に、次のコードを改善する方法をお知りになりたいビューファイル

<% articles.each do |article| %> 

    <div> 
    <%= link_to 'add', '#', :id => "create_#{article.id}" %> 
    </div> 

    <script type="text/javascript"> 
    # Code - Block 1 
    $jQ('#create_<%= article.id %>').live('click', function(event) { 
     $jQ.ajax({ 
     type: "POST", 
     url:  "<%= article_url(@article) %>/create", 
     data: "article_id=<%= @article.id %>", 
     error: function(jqXHR, textStatus, errorThrown) { 
      alert(textStatus + ' - ' + errorThrown + '\n\n' + jqXHR.responseText); 
     }, 
     success: function(data, textStatus, jqXHR) { 
      $jQ('#create_<%= article.id %>').replaceWith('<%= escape_javascript("added") + (link_to 'remove', '#', :id => "destroy_#{article.id}") %>') 
     } 
     }); 
    }); 

    # Code - Block 2 
    $jQ('#destroy_<%= .id %>').live('click', function(event) { 
     $jQ.ajax({ 
     type: "POST", 
     url:  "<%= article_url(@article) %>/destroy", 
     data: "article_id=<%= @article.id %>, 
     error: function(jqXHR, textStatus, errorThrown) { 
      alert(textStatus + ' - ' + errorThrown + '\n\n' + jqXHR.responseText); 
     }, 
     success: function(data, textStatus, jqXHR) { 
      $jQ('#destroy_<%= article.id %>').replaceWith('<%= escape_javascript("removed") + (link_to 'add', '#', :id => "create_#{article.id}") %>') 
     } 
     }); 
    }); 
    </script> 

<% end %> 

  • each声明!
  • 上記の2つのコードブロックはほぼ同じです。

答えて

0

何ができるかは、巣は、あなたの記事のループの内部方法の別の配列であり、それに応じて各メソッドの内部のコードブロックを微調整するためにそれを使用。

ここでは例です:あなたの他のオプション

<% articles.each do |article| %> 

  <div> 
    <%= link_to 'add', '#', :id => "create_#{article.id}" %> 
  </div> 

    <script type="text/javascript"> 
    <% [:create,:destroy].each do |method| %> 
         $jQ('#<%="#{method}_#{article.id}" %>').live('click', function(event) { 
           $jQ.ajax({. 
             type:    "POST", 
             url:     "<%= "#{article_url(@article)}/#{method}" %>", 
             data:    "article_id=<%= @article.id %>", 
             error:   function(jqXHR, textStatus, errorThrown) { 
               alert(textStatus + ' - ' + errorThrown + '\n\n' + jqXHR.responseText); 
             }, 
             success: function(data, textStatus, jqXHR) { 
               $jQ('#<%="#{method}_#{article.id}" %>').replaceWith('<%= escape_javascript({'create'=>'added','destroy'=>'removed'}[method]) + (link_to({'create'=>'add','destroy'=>'remove'}[method], '#', :id => "#{method}_#{article.id}")) %>') 
             } 
           }); 
         }); 

    <% end %> 
    </script> 
<% end %> 

(テストされていないが、近いはずである)は、物品及び方法をとり、正しい出力を生成するヘルパーメソッドにこれを有効にしている、またはあなたが置くことができますHTMLタグ内の必要なデータとそれを変換するjavascriptがあります。

+1

定義をすべて1つの場所に保存するために、[[:create、 'added']、[:destroy、 'removed']]ループを繰り返すと思います。 –

+0

私は同意します。それは読みやすくなります。 – spd

+0

これは私が言ったことです。あなたのコードを複製していましたが、2つのイベントがコールバックやその他のものと大きく異なることが判明したときに、重複が必要になることがあります。これを念頭に置いてください。線を減らすのはいいですが、必ずしも有益なわけではありません。ルーピングにはさらに処理(時間)が必要です。 – vol7ron

1
  • 文字列
  • に本体を入れて、あなたを補間し、二回(0..1)2回の反復(['destroy','removed','add','create']['create','added','remove',destroy']で1、その他)
  • ループのための配列の配列を持っていますarray[0][0], array[0][0], array[0][0], array[0][1], array[0][2], array[0][3]
  • 2パス目:テキストは
    • 第1パスを発見され、それらのスロットの配列値array[1][0], array[1][0], array[1][0], array[1][1], array[1][2], array[1][3]

注:私のRubyは錆びているので、ここで擬似コードです。
例(ary[i][n]を探してください):

ary = [['create','added','remove',destroy'], 
     ['destroy','removed','add','create']] 

for i in (0..1) 
    $jQ('#**ary[i][0]_<%= article.id %>').live('click', function(event) { 
     $jQ.ajax({ 
     type: "POST", 
     url:  "<%= article_url(@article) %>/ary[i][0]", 
     data: "article_id=<%= @article.id %>", 
     error: function(jqXHR, textStatus, errorThrown) { 
        alert(textStatus + ' - ' + errorThrown + '\n\n' + jqXHR.responseText); 
        }, 
     success: function(data, textStatus, jqXHR) { 
        $jQ('#ary[i][0]_<%= article.id %>') 
         .replaceWith('<%= escape_javascript("ary[i][1]") + (link_to 'ary[i][2]', '#', :id => "ary[i][3]_#{article.id}") %>') 
        } 
     }); 
    }); 
end 
+0

あなたのアプローチはまったく理解できませんでした(おそらく初心者なので)。配列[0] [0]、配列[0] [0]、配列[0] [0]、... 'および'配列[1] [0]、配列[1] [0 ]、配列[1] [0]、... '? array [loopCountVar]の "ループ"はどうすればよいですか? – Backo

+0

私はあなたの文字列の中で最初の配列要素を3回呼び出すことを意味します。私はRubyを覚えていないので、サンプルコードを提供するつもりはありませんでしたが、文が混乱していることがわかりましたので、いくつかの擬似コードを入れました。 – vol7ron

+0

あなたは 'for i(0..1)' ... 'end'のようなものに上記を入れます。上記のコードを編集してデモンストレーションしました。注:ループと配列はRubyコードになります。補間の仕方を理解できるようにします。 – vol7ron

関連する問題

 関連する問題