我在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()
答案 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 %>'))