因此,我最初在rails应用程序中实现ajax的方法是为每个控制器的每个操作创建一个js文件,然后在respond_to块中引用该js文件。
这真的很烦人,我喜欢将所有的javascript包含在一个main.js文件中,而不是将每个片段分开。
到目前为止,这一直很好用,除非我想将一个对象传递给正确的函数。
以下是我应该如何处理在我的应用中创建新用户列表的ajax请求:
<%= form_for @client, action: :create, remote: true do |f| %>
<%= f.text_field :firstname, placeholder: 'First Name' %>
<%= f.text_field :lastname, placeholder: 'Last Name' %>
<%= f.hidden_field :status, value: true %>
<%= submit_tag :create %>
<% end %>
.... form获取remote:true标记。
def create
@client = current_trainer.clients.create(client_params)
respond_to do |format|
format.html { redirect_to clients_path }
format.js
end
end
.... create action传递对默认创建文件的响应:
$('.active').prepend("<%= j render @client %>");
这一切都很好,花花公子。但我不喜欢这种设置。我想这样打个电话:
def create
@client = current_trainer.clients.create(client_params)
respond_to do |format|
format.html { redirect_to clients_path }
format.js { render js: "theApp.clientsPage.saveClient();" }
end
end
....然后在main.js.erb文件中我有:
saveClient: function() {
$('.active').prepend("<%= j render @client %>");
},
但我得到的错误如下:
undefined method `render' for #<#<Class:0x007fd278f350c8>:0x007fd27b182298>
答案 0 :(得分:0)
main.js.erb
仅包括布局我认为,是吗?然后它会在启动时进行编译(例如,main#index
操作中的此表单)index
操作,您没有@client
。
只需给saveClient
函数一个参数,就像这样:
saveClient: function( newElement ) {
$( ".active" ).prepend( newElement );
},
然后在create
动作电话:
format.js { render js: "theApp.clientsPage.saveClient( $( \"<div>#{ j render @client }</div>\" ) );" }