2012-03-16 89 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