js.erb是如何工作的

Mat*_*iby 6 javascript ruby ruby-on-rails asp.net-ajax erb

最近我遇到了一些正在使用的应用程序,js.erb我不确定如何使用它...这是下面的代码.有人可以帮我理解这是如何工作的吗?

routes.rb文件中

map.resources :player_emails
Run Code Online (Sandbox Code Playgroud)

我的控制器player_emails_controller.rb在创建动作中

def create
 @player_email = PlayerEmail.create(params[:player_email])
 if @player_email.save
  @response_txt = "The player has been emailed."
  PlayerEmailsMailer.deliver_pattern_email(@something, @player_email, request.host_with_port)
  @error = false
 else
  @error = true
  @response_txt = "Please make sure you entered your name and a valid email address."
 end
end
Run Code Online (Sandbox Code Playgroud)

然后我有文件 player_emails/create.js.erb

$('#player_email_ind').hide();
$('#player_email_submit').show();
$('#player_response_msg').html("<%= escape_javascript @response_txt %>").fadeIn();
<% unless @error %>
$('#player_email_form')[0].reset();
<% end %>
Run Code Online (Sandbox Code Playgroud)

我知道jquery会发生什么,但我不知道这是怎么做的ajax.它是否只是ajax在有js.erb... 时自动进行调用...有人可以解释它的工作方式以及为什么我不需要在控制器操作中的respond_to告诉它这是format.js

mar*_*ark 7

如果发出了js(ajax)请求,它将通过呈现js.erb文件来响应,反之亦然.

这是正在执行的默认行为:

  respond_to do |format|
    format.js{
      render :template => 'create.js.erb'
    }
    format.html{
      render :template => 'create.html.erb'
    }
  end
Run Code Online (Sandbox Code Playgroud)


zet*_*tic 5

提交表单时,它会执行POST /player_emails.资源声明routes.rb确保请求由处理PlayerEmailsController#create.

控制器负责处理它接收的每种格式.在AJAX调用的情况下,格式为'js',并通过从URL(/player_emails.js)的末尾显式添加格式字符串或(更可能)通过从请求标头中推断格式来设置.

在您的情况下,该create操作除了AJAX之外不会有任何其他需要,因此它需要一个快捷方式并省略respond_toformat块.控制器已经发现格式为'js',所以当create完成时它采取默认操作,为format(create.js.erb)呈现适当的模板.


Sam*_*amo 3

您的表单提交按钮:remote => true上有 吗?如果是这样,则可能有一些 JavaScriptrails.jsapplication.js通过 AJAX 自动提交。底线是,某处必须有一些 JavaScript 进行 AJAX 调用并请求 js 或 JSON 响应,否则它将是一个 html 请求。

至于为什么不需要respond_to块,我不完全确定。也许因为调用总是由 AJAX 进行,并且有一个可用的 js.erb 模板,所以它只是做它的事情而不抱怨。有 html.erb 模板吗?如果没有,请尝试执行常规表单提交并查看是否有问题。