Rails:使用控制器呈现js.erb模板

时间:2012-03-16 10:47:20

标签: ruby-on-rails ajax

我有一个rails应用程序尝试合并一些AJAX,其中点击新打开一个模态窗口和一个表单。我希望能够显示验证错误,如果失败,那么在我的创建操作中,我想重新渲染new.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\">

我已尝试将各种选项放入渲染块但没有运气。有什么提示吗?

2 个答案:

答案 0 :(得分:15)

最佳做法是支持AJAX和非AJAX调用,以防用户因任何原因关闭了javascript。

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.erb new.js.erb,具体取决于它是非AJAX还是AJAX调用。< / p>

new.js.erb中输入你的ERB / javascript代码:

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

答案 1 :(得分:1)

据我所知,在控制器中渲染部分是一个坏主意,因为那时响应可能没有内容类型,有些浏览器无法理解这一点。如果是某个文件附加到行动你应该写

render :action => "create"

或者如果你需要渲染一个单一的部分然后在你的动作文件写

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

正如我所说,那么你的回复内容类型不会出现问题