从控制器返回javascript而没有特定于动作的js文件

时间:2014-07-11 05:44:20

标签: ruby-on-rails ruby-on-rails-4

因此,我最初在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>

1 个答案:

答案 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>\" ) );" }