2012-03-16 67 views
1

我有一個Rails應用程序嘗試合併一些AJAX,點擊新建打開模式窗口和窗體。我希望能夠顯示驗證錯誤,如果它失敗了,所以在我的創建操作中,我想重新渲染new.js.erb文件。這是正確的方法嗎?在我的瀏覽器,如Rails:使用控制器渲染js.erb模板

def create 
    @place = Place.new(params[:place]) 
    if @place.save 
     redirect_to places_path, :notice => "Successfully created place" 
    else 
     render "new.js.erb" 
    end 
end 

結果我得到的是逃脫JS文字:

$("#new_grouping").html("<div class=\"modal-header\">\n <a class=\"close\" data- dismiss=\"modal\">×<\/a>\n <h3>Create a new menu section<\/h3>\n<\/div>\n<form accept-charset=\"UTF-8\" action=\"/places/1-mama-s-pizza/groupings\" class=\"simple_form new_grouping\" id=\"new_grouping\" method=\"post\" novalidate=\"novalidate\"> 

我試圖把各種選擇到渲染塊,但沒有運氣。有小費嗎?

回答

14

如果用戶因任何原因關閉了JavaScript,最佳做法是同時支持AJAX和非AJAX調用。

def create 
    @place = Place.new(params[:place]) 

    respond_to do |format| 
    if @place.save 
     format.html { redirect_to places_path, :notice => "Successfully created place" } 
     format.js # renders create.js.erb, which could be used to redirect via javascript 
    else 
     format.html { render :action => 'new' } 
     format.js { render :action => 'new' } 
    end 
    end 
end 

render :action => 'new'實際呈現控制器動作new分別結果new.html.erbnew.js.erb取決於它是否是一個非AJAX或AJAX調用的模板。

new.js.erb去你的ERB/javascript代碼:

$("#new_grouping").html("<%= escape_javascript(...) %>"> 
+0

好的建議。我一定會支持這兩個。然而,它讓我思考,我沒有辦法實現我想要的,即如果失敗,我的屏幕上呈現的JavaScript響應POST CREATE操作。它必須是重定向或再次呈現整個頁面。這是公平的嗎? – chourobin 2012-03-16 11:44:36

+0

嗯,是的,沒有。這取決於你如何編寫'new.js.erb'以及你在那裏做了些什麼。您只能將一些錯誤特定的HTML插入到頁面的某些元素,而不是再次渲染整個事物。但根據我的經驗,你必須記住很多事情。所以我實際上不會建議完全使用AJAX – Vapire 2012-03-16 12:16:58

0

我所知,渲染控制器部分是一個壞主意,因爲這樣的反應可以是沒有內容類型和一些瀏覽器無法理解這樣的。如果是附加到採取行動的一些文件,你應該寫

render :action => "create" 

,或者如果你只需要渲染部分則燎在你的行動文件寫

<%= render :partial => "path/to/partial" %> 

正如我所說的,那麼你將不會有內容類型問題

+0

完成整個POST CREATE操作,你不能只設置內容類型嗎? – Magne 2017-09-12 13:27:17