Rails 4,JS ERB响应呈现application.html而不是指定的部分

时间:2016-01-13 23:01:27

标签: javascript jquery ruby-on-rails ajax ruby-on-rails-4

我对控制器动作进行了非常简单的ajax调用,该动作应该将表单呈现给指定的div。除了没有任何渲染到div,而控制器,服务器和控制台中的所有内容都表明它应该工作。我已经检查并仔细检查了div的名称是否相同,我已经重命名了以查看是否存在冲突,我甚至在同一页面上有一些东西可以执行我想要的操作 - 但它就行不通

在Chrome中进一步检查时,会出现“js.erb”字样。没有得到适当的评估。 当渲染文件时,它应该输出我的js erb文件的内容(在其他情况下可以正常工作),除了它输出整个布局和部分封装。

我已经在此处发出警告以获得良好的衡量标准,这不会被解雇(它会在项目中与其他js控制器一起测试)。

 .........
<div class='container'>
  <div class='row'>
    <section class='col-lg-12'>
      <div class='panel panel-default'>
        <div class='panel-body'>
          alert('test');
          $("#membershipForm").html("<form novalidate=\"novalidate\" 

这是控制器动作

  def new
    @membership = Membership.new(membershipable_type: params[:membershipable_type],
                                 membershipable_id: params[:membershipable_id])
    respond_to do |format|
      format.js { render 'new' }
    end
  end

这里是new.js.erb

alert('test');
$("#membershipForm").html("<%= j render('memberships/partials/form') %>");

这很奇怪,我真的不明白发生了什么。

2 个答案:

答案 0 :(得分:1)

您需要在layout: false方法中设置render。像这样render(template: 'foo/bar', layout: false)

此外,我认为通过.js.erb实现对其他开发人员来说并不是一个好方法。我建议你像我下面描述的那样实现。

删除new.js.erb并将其添加到new.erb

<%= javascript_tag do %>
  alert('test');
  $("#membershipForm").html(<%= render_to_string(template: 'members/partials/form', layout: false) %>);
<% end %>

答案 1 :(得分:0)

问题无疑与您的format.js { render "new" }有关 - 您可以通过以下方式做得更好:

#app/controllers/memberships_controller.rb
class MembershipsController < ApplicationController
   respond_to :js, :html

   def new
       @membership = Membership.new membershipable_type: params[:membershipable_type], membershipable_id: params[:membershipable_id]
   end

   def create
       @membership = Membership.new membership_params
       @membership.save
   end

   private

   def membership_params
       params.require(:membership).permit(:membershipable_type, :membershipable_id)
   end
end

以上内容将调用相应操作的.js.erb个文件:

#app/views/memberships/new.js.erb
$("#membershipForm").html("<%= j render 'memberships/partials/form' %>");

这应该有用。