通过轨道上的javascript文件ruby渲染局部视图

时间:2015-10-09 12:30:11

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

我有一个只包含谷歌地图的索引文件(通过javascript映射)。当我在某个地方搜索时,它也会在地图上将其附近钉在现在很好的地方。但我想要的是,当我点击地图上的标记时。它应该在地图下方的同一页面上显示一个div的地方细节。我创建了ajax assets / javascript / customer.js,将URL指向控制器/ customers / index中的客户控制器,我得到整个页面作为响应。我们知道这是错误的。这是我的js文件内容

$.ajax({
  url: "/",
  async: false,
  method: "post",
  data: { "place_id" : place["place_id"] },
  success: function(data){
       alert('success');
     }
   });
   infoWindow.open(map, marker);
   buildIWContent(place);
});

我的控制器功能是

def index
  if params[:place_id]
    @place = Places.find(params['place_id'])
  end
end

这就是我想在我的索引页面中显示的内容,即html.erb

<% if @place %>
  <div class='place-name'><% @place.name %></div>
<% end %>

我知道在rails中支持部分内容,但我不知道这些内容是否有效。我是Rails的新手,如果你发现我的问题非常愚蠢,请原谅我。 我只想通过ajax魔法来展示这个地名div,无论是通过局部还是原样。

2 个答案:

答案 0 :(得分:2)

要解决您的问题,您必须在此处修改一些代码。首先,您必须将您的ajax请求方法和网址修改为:

$.ajax({
  url: "/customers",
  async: false,
  method: "GET",
  data: { "place_id" : place["place_id"] },
  success: function(data){
       alert('success');
     }
   });
   infoWindow.open(map, marker);
   buildIWContent(place);
});

当您完成访问客户索引页面时,它会显示警告。 然后。在索引方法中,尝试执行以下操作:

def index
  if params[:place_id]
    @place = Places.find(params['place_id'])
  end
  respond_to do |format|
    format.html
    format.js
  end
end

然后。您必须创建新文件index.js.erb包含

$('.place-name').text('<%= @place %>');

它只是原型。您必须以自己的方式进行自定义

答案 1 :(得分:0)

如果我正确理解您的问题,您希望将Rails部分渲染为对AJAX调用的响应。如果是这样的话,那就错误地思考了它。

Rails只是一个Web服务器。它返回文本有效负载,可以是JSON,XML或HTML(以及其他内容)。部分或ERB模板只是生成的JSON或HTML的抽象。

当您加载页面时,Rails会将ERB(以及部分,布局等)编译为HTML有效内容并返回该值。因此,如果您要向端点发出AJAX请求,您将获得所有HTML(包括布局)。您可以执行render layout: false之类的操作来渲染布局,但是您需要一个条件或单独的端点来知道何时渲染布局以及何时不渲染布局。

一般来说,社区似乎正在逐渐远离这一点,因为AJAX请求偏向于JSON服务器响应的客户端模板,但你仍然可以通过添加layout: false(或任何你想要的布局)来实现它。