0

我在 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 名称。下面的所有咖啡脚本都遵循我上面列出的所有视图中的确切结构。上面列出的所有 create.js.coffee 文件实际上是相同的。我的问题是减少重复的最佳方法是什么?这会是我应该为其创建插件的东西吗?我应该把它放在一个助手中......等等。我不确定如何在 Rails 中处理这个问题,因为我是一名前 php 程序员 :( 任何人的帮助将不胜感激!

用户视图的 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

$('#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()
4

1 回答 1

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 %>'))
于 2012-05-15T11:44:45.233 回答