【问题标题】:How to call show action via Ajax如何通过 Ajax 调用显示操作
【发布时间】:2014-04-11 07:11:17
【问题描述】:

我只是想从这个问题开始,使用 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>

从哪里开始比较好,我需要考虑什么才能让它发挥作用?

【问题讨论】:

    标签: jquery ruby-on-rails ajax


    【解决方案1】:

    我们可以通过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>
    

    或者您可以执行 RSB 建议的普通 AJAX。在你的表演动作中,你需要添加render layout: false

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

    【讨论】:

    • 惊人的答案,非常感谢,生病让你知道它是怎么回事
    • 好的,所以我已经实现了这个,但它会将我重定向到 gallery/:id 例如
    • 我猜,remote: true 没有执行。当我们在 html5 中使用 remote:true 时,它​​会在锚标记中附加 data-remote=true。请在开发者工具中检查,也请检查您的浏览器是否启用了javascript。
    • 好的,所以在锚标签中得到了数据远程=真,现在点击链接时什么都没有发生
    • 请检查rails的控制台,可能有一些服务器端错误。
    【解决方案2】:

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

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

    【讨论】:

    • 这将检索整个页面,如资产、标题等。还是只会获取页面上的内容?
    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多