【问题标题】:Rails: rendering the js.erb template using the controllerRails:使用控制器渲染 js.erb 模板
【发布时间】:2012-03-16 10:47:20
【问题描述】:

我有一个 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\">

我尝试将各种选项放入渲染块,但没有成功。有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails ajax


    【解决方案1】:

    最好的做法是同时支持 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 =&gt; 'new' 实际上将控制器操作的模板 new 渲染为 new.html.erb 和 new.js.erb,具体取决于它是非 AJAX 调用还是 AJAX 调用。

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

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

    【讨论】:

    • 好推荐。我肯定会支持两者。但是,这让我开始思考,我无法实现我想要的,即如果 POST CREATE 操作失败,则在我的屏幕上呈现 javascript 来响应它。它必须是重定向或再次呈现整个页面。这样说公平吗?
    • 嗯,是的,不是的。这取决于您如何编写new.js.erb 以及您在其中实际执行的操作。您只能在页面的某些元素中插入一些特定于错误的 HTML,而不能再次呈现整个内容。但根据我的经验,你必须记住很多事情。所以我实际上不建议完全使用 AJAX 进行整个 POST CREATE 操作
    【解决方案2】:

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

    render :action => "create"
    

    或者如果您只需要渲染单个部分,那么在您的操作文件中写入

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

    正如我所说,那么响应中的内容类型不会有问题

    【讨论】:

    • 不能只设置内容类型吗?
    猜你喜欢
    • 2014-05-28
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多