2011-01-05 51 views
6

最近我遇到了一些使用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

回答

3

請問您提交表單按鈕有:remote => true就可以了嗎?如果是這樣,則可能會有一些通過AJAX自動提交的rails.jsapplication.js中的JavaScript。底線是,必須有一些JavaScript正在進行AJAX調用,並要求提供js或JSON響應,否則這將是一個html請求。

至於爲什麼你不需要respond_to塊,我不完全確定。也許由於該調用總是由AJAX進行,並且有一個js.erb模板可用,它只是在沒有抱怨的情況下做它的事情。是否有html.erb模板?如果不是,請嘗試進行常規表單提交併查看是否投訴。

6

如果發出js(ajax)請求,它將通過呈現js.erb文件進行響應,反之亦然。

這是正在執行的默認行爲:

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

當提交表單時,它的支撐柱,/player_emailsroutes.rb中的資源聲明確保請求由PlayerEmailsController#create處理。

控制器負責處理它收到的每種格式。在AJAX調用的情況下,格式爲'js',並且通過將格式字符串明確地添加到URL的末尾(/player_emails.js)或者通過從請求頭部推斷格式(更可能)來設置。

對於您的情況,create操作不期望AJAX以外的任何操作,因此它採用快捷方式並省略了respond_toformat塊。控制器已經發現格式爲'js',因此當create完成時,它將採用爲格式(create.js.erb)渲染相應模板的默認操作。