js.erb是如何工作的

问题描述:

最近我遇到了一些使用js.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是怎么回事,但我不知道这是如何做0123致电。是否当有js.erb只是自动做一个ajax电话...有人可以解释,告诉它这个我不需要在控制器动作的respond_to这种工作方式,为什么format.js

+1

我只是好奇,如果有一个教程写.js.erb那里... – 2014-03-30 23:29:05

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

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

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

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

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

当提交表单时,它的支撑柱,/player_emailsroutes.rb中的资源声明确保请求由PlayerEmailsController#create处理。

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

对于您的情况,create操作不期望AJAX以外的任何操作,因此它采用快捷方式并省略了respond_toformat块。控制器已经发现格式为'js',因此当create完成时,它将采用为格式(create.js.erb)渲染相应模板的默认操作。