javascript - 改进 View 文件中的 JavaScript 代码

标签 javascript jquery ruby-on-rails ruby ruby-on-rails-3

我正在使用 Ruby on Rails 3.0.7,我想知道如何重构DRY(不要重复自己)和改进 我的 View 文件中的以下代码:

<% 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 语句!
  • 上面的“两个代码块”几乎相等。

最佳答案

  • 将主体放在一个字符串中
  • 有一个数组数组用于两次迭代(一次使用 ['create','added','remove',destroy'],另一个使用 ['destroy','删除','添加','创建'])
  • 循环两次 (0..1),为找到文本的那些槽插入数组值
    • 第一遍:数组[0][0]、数组[0][0]、数组[0][0]、数组[0][1]、数组[0][2]、数组[0][3]
    • 第二遍:数组[1][0]、数组[1][0]、数组[1][0]、数组[1][1]、数组[1][2]、数组[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

关于javascript - 改进 View 文件中的 JavaScript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6603713/

相关文章:

javascript - 如何更改标签、ID 或类无法选择的文本?

javascript - 切换按钮以显示/隐藏来自 API 的数据

javascript - 如何打开 javascript 弹出窗口并使用 document.write 将变量添加到 href?

ruby-on-rails - 如何将列的值传递给validates的自定义错误信息

ruby-on-rails - 具有 hstore 属性的制造商

javascript - 异步函数中 window.open() 的多次迭代

javascript - 访问从组件中的 Action 创建者返回的信息是否会破坏 Flux?

javascript - 我需要 jquery 来访问这个嵌套的 div

javascript - jQuery 将相似的项目与标题分组

mysql - 使用现有的 mysql 数据库创建 ActiveAdmin 项目?