js.erb是如何工作的

时间:2011-01-05 17:01:23

标签: javascript ruby-on-rails ruby asp.net-ajax erb

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

routes.rb文件

map.resources :player_emails

创建操作

中的控制器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

然后我有文件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 %>

我知道jquery会发生什么,但我不知道这是如何进行ajax调用的。当有ajax时它是否会自动执行js.erb调用...有人可以解释这种方式的工作方式以及为什么我不需要在控制器操作中使用respond_to来告诉它这是{{1} }

3 个答案:

答案 0 :(得分:6)

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

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

  respond_to do |format|
    format.js{
      render :template => 'create.js.erb'
    }
    format.html{
      render :template => 'create.html.erb'
    }
  end

答案 1 :(得分:5)

提交表单后,它会对/player_emails进行POST。 routes.rb中的资源声明可确保请求由PlayerEmailsController#create处理。

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

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

答案 2 :(得分:3)

您的表单提交按钮上是否有:remote => true?如果是这样,rails.jsapplication.js中可能会有一些JavaScript通过AJAX自动提交。最重要的是,必须有一些JavaScript正在进行AJAX调用并要求js或JSON响应,否则它将是一个HTML请求。

至于为什么你不需要respond_to块,我不完全确定。也许因为调用始终是由AJAX进行的,并且有一个可用的js.erb模板,所以它可以毫无怨言地完成它的工作。是否有html.erb模板?如果没有,请尝试进行常规表单提交,看看是否有抱怨。