如何通过Ajax调用show action

时间:2014-04-11 07:11:17

标签: jquery ruby-on-rails ajax

我正在寻找一个可以从这个问题开始的地方,使用Ajax在我的索引操作中显示内容。我有这个控制器设置

 class GalleriesController < ApplicationController

 def index
   @galleries = Gallery.all
 end

def show
  @gallery = Gallery.find(params[:id])
end

end

我的索引页面上有一个图库

<ul id="portfolio-grid">
  <% @galleries.each do |g| %>
  <li class="mix <%= g.category.name %> mix_all">
    <% g.gallery_images.take(1).each do |i| %>
    <%= image_tag(i.photo.url(:gallery_portfolio_home), class: 'open-project') %>
    <a href='<%= gallery_path(id: g.id) %>' class="open-project">
    <% end %>
      <div class="project-overlay">
        <i class="fa fa-plus-circle fa-3x"></i>
        <span class="project-name"><%= g.title %></span>
        <span><%= g.category.name %></span>         
      </div>
    </a>
  </li>
  <% end %>
</ul>

  <!-- Ajax Loaded -->
<div id="project-extended">
  <div class="container">
    <ul id="project-controls">
      <li>
        <a href="#" id="close-project">
          <i class="fa fa-times fa-2x"></i>
        </a>
      </li>
    </ul>
    <div id="project-content"></div>
  </div>
</div>
<!-- End Ajax Loaded -->

当我点击图片时,我想将我的展示页面的内容填充到我的div#project-content中,目前我的展示页面看起来像这样

<div id="project">
 <div class="col-md-6">
  <div class="project-media">
   <div class="project-slider">
       <ul class="slides">
        <% @gallery.gallery_images.each do |image| %>
          <li><%= image_tag(image.photo.url(:gallery_flexslider)) %>
              <p class="flex-caption"><%= image.gallery_category.name %></p>  
            </li>
        <% end %>
       </ul>
   </div>
 </div>

哪里是一个好的起点,关于让它发挥作用,我需要考虑什么?

感谢任何帮助,谢谢

2 个答案:

答案 0 :(得分:2)

我们可以UJS执行此操作,因为您需要在anchor_tag中添加remote: true

<ul id="portfolio-grid">
  <% @galleries.each do |g| %>
  <li class="mix <%= g.category.name %> mix_all">
    <% g.gallery_images.take(1).each do |i| %>
    <%= image_tag(i.photo.url(:gallery_portfolio_home), class: 'open-project') %>
    <%= link_to "", gallery_path(g), remote: true %>
    <% end %>
      <div class="project-overlay">
        <i class="fa fa-plus-circle fa-3x"></i>
        <span class="project-name"><%= g.title %></span>
        <span><%= g.category.name %></span>         
      </div>
    </a>
  </li>
  <% end %>
</ul>

为此,我们需要添加一个视图文件'show.js.erb'。现在这里是此文件的以下代码。

$('#project-content').html("<%= j render '/galleries/gallery'%>")

在gallery /中,我们需要创建一个名为_gallery.html.rb的部分。并且需要放置内容

<div id="project">
 <div class="col-md-6">
  <div class="project-media">
   <div class="project-slider">
       <ul class="slides">
        <% @gallery.gallery_images.each do |image| %>
          <li><%= image_tag(image.photo.url(:gallery_flexslider)) %>
              <p class="flex-caption"><%= image.gallery_category.name %></p>  
            </li>
        <% end %>
       </ul>
   </div>
 </div>

或者你可以做普通的AJAX,RSB建议。对于show动作中的那个,您需要添加render layout: false

def show
  @gallery = Gallery.find(params[:id])
  render layout: false
end

答案 1 :(得分:1)

如果只有ajax那么你可以使用这个

$.ajax({
    type: "GET",
    url: "/galleries/"+id,
})