Rails 3.2试图减少jQuery Ajax远程表单中的重复

时间:2012-05-14 21:20:22

标签: ruby-on-rails-3 jquery ruby-on-rails-3.1 coffeescript

我在Rails 3.2中开发了一个后端,允许管理员使用ajax和jQuery执行CRUD操作。我用几个控制器/视图使用js.coffee文件来处理ajax。我的视图的文件结构示例如下。

views
  users
    index.html.erb
    _form.html.erb
    _edit_form.html.erb
    _user.html.erb
    create.js.coffee
    edit.js.coffee        
    update.js.coffee
    destroy.js.coffee
  customers
    index.html.erb
    _form.html.erb
    _edit_form.html.erb
    _customer.html.erb
    create.js.coffee
    edit.js.coffee        
    update.js.coffee
    destroy.js.coffee
   email_blasts
     index.html.erb
     _form.html.erb
     _edit_form.html.erb
     _blast.html.erb
     create.js.coffee
     edit.js.coffee        
     update.js.coffee
     destroy.js.coffee
  .
  .
  .
  .

下面是用户视图和客户视图的示例create.js.coffee。请注意遵循精确模式的实例变量和div名称。下面的所有coffeescript都遵循我在上面列出的所有视图中的确切结构。上面列出的所有create.js.coffee文件几乎都是相同的。我的问题是减少重复的最佳方法是什么?这是我应该为其创建一个插件吗?我应该把它放在帮手......等等。我不知道如何在rails中处理这个,因为我以前是一个php程序员:( Anyones帮助将不胜感激!

用户视图的

create.js.coffee:

$('#errors').empty()
$('#errors').show()
<% if @user.errors.any? %>
  $('<%= escape_javascript(render :partial => "errors", :locals => {:target => @user })%>')
    .appendTo('#errors')
<% else %>
  $('<%= escape_javascript(render(:partial => @user))%>')
    .appendTo('#user_table')
    .hide()
    .fadeIn(200)
$('#errors').hide()
$('#new_user')[0].reset()
$('#users_count').html '<%= users_count %>'
<% end %>
$('#error_close').click ->
  $('#errors').fadeOut() 

create.js.coffee for Customer视图

$('#errors').empty()
$('#errors').show()
<% if @customer.errors.any? %>
  $('<%= escape_javascript(render :partial => "errors", :locals => {:target => @customer })%>')
    .appendTo('#errors')
<% else %>
  $('<%= escape_javascript(render(:partial => @customer))%>')
    .appendTo('#customer_table')
    .hide()
    .fadeIn(200)
  $('#errors').hide()
  $('#new_customer')[0].reset()
  $('#customers_count').html '<%= customers_count %>'
<% end %>
$('#error_close').click ->
  $('#errors').fadeOut()

1 个答案:

答案 0 :(得分:0)

你应该构建你的代码,如果你想重用它,停止混合javascript和erb。制作完成工作的JavaScript类,并将数据放在页面中的脚本标记中......

尝试使用一些框架,通过提供像Backbone.js这样的结构来帮助您。

这可能对您有用:

或者凌乱的方式:

# Function 
foo = (condition, firstBlock, secondBlock) ->
  $('#errors').empty()
  $('#errors').show()
  if condition
    firstBlock
      .appendTo('#errors')
  else
    secondBlock
      .appendTo('#customer_table')
      .hide()
      .fadeIn(200)
    $('#errors').hide()
    $('#new_customer')[0].reset()
    $('#customers_count').html '<%= customers_count %>'
  $('#error_close').click ->
    $('#errors').fadeOut()

# Execution
foo(<% @user.errors.any? %>, $('<%= stuff %>'), $('<%= moreStuff %>'))