【问题标题】:Render rails partial with ajax call and remote => true使用 ajax 调用和远程渲染 rails 部分 => true
【发布时间】:2013-03-15 03:22:54
【问题描述】:

我有一个页面,taxons#show,列出了一堆产品,当你点击一个产品时,它会带你到 products#show,这是单个产品页面。此页面显示部分 _cart_form.html.erb,它具有将产品添加到购物车、选择尺寸、颜色等功能。

在 Taxons#show 上,当您单击产品时,我想在 taxons#show 上显示一个灯箱,而不是转到单个产品页面,其中包含 _cart_form.html.erb 部分。我有灯箱工作,当您单击图像时,它会正确显示灯箱,而不是转到 products#show 页面,但我不确定如何渲染其中的部分内容。这是我到目前为止的链接:

<div class="main-image" id="single_<%= product.id %>" data-productid="<%= product.id %>">
      <%= link_to large_image(product, :itemprop => "image", :class => "product-image", :id => product.id), product_path(product), :remote => true, :html => {:class => "product_popup"}  %>
</div><!-- main-image-->

灯箱代码是一个 div,它是 display: none until clicked,看起来像这样:

<%# ******LIGHTBOX******* %>
<div id="product_popup_<%= product.id %>" class="product_popup" data-popid="<%= product.id %>">
        <div class="related-products">
          <ul class="related_products_list" id="related_products_list_<%= product.id %>" data-listid="<%= product.id %>">
         <% @related_products.each do |related_product| %>
         <li class="related_products_item"><%= link_to large_image(related_product, :itemprop => "image", :data => {:imageid => related_product.id}, :id => "related_" + related_product.id.to_s, :class => "related_products_image dimmed"), url_for(related_product) %></li>
         <% end %>
    </ul>
        </div>
        <div class="popup-image">
        <%= large_image(product, :itemprop => "image", :class => "product-image-popup") %>
</div><!-- popup-image -->

谁能告诉我当您在灯箱内单击该链接时如何渲染部分内容?谢谢!

编辑**

当我尝试直接在分类单元#show 内的灯箱中渲染部分时,我收到以下 NoMethod 错误:

 NoMethodError in Spree/taxons#show

 Showing    /home/telegraph/telegraph1/pants.telegraphbranding.com/app/views/spree/shared/_cart_form.html.erb where line #4 raised:

undefined method `has_variants?' for nil:NilClass
Extracted source (around line #4):

1: <%= form_for :order, :url => populate_orders_path do |f| %>
2:   <div id="inside-product-cart-form" data-hook="inside_product_cart_form"     itemprop="offers" itemscope itemtype="http://schema.org/Offer">
3: 
4:     <% if @product.has_variants? %>
5:       <div id="product-variants" class="columns five alpha">
6:         <h6 class="product-section-title"><%= t(:variants) %></h6>
7:         <ul>

[2013 年 9 月 24 日更新]

标记的解决方案修复了上述问题,但导致可怕的堆栈级别太深错误,导致我放弃了该功能。但我认为这是一个很好的解决方案:

Can't find root of 'stack level too deep' error when rendering partial

【问题讨论】:

  • 灯箱是否硬编码到您的页面中,并且某些 JS 只是切换它?还是所有灯箱内容都从您的应用程序中以 ajax 方式返回?
  • 现在灯箱是用 JS 切换硬编码的。不过,Rails 为每个灯箱引入了不同的产品。

标签: ruby-on-rails ajax


【解决方案1】:

我的做法是让您的应用以 AJAX 方式渲染灯箱

products_controller.rb

def show
  @product = Product.find params[:id]
  respond_to :js
end

show.js.erb

$("[id^='product_popup_']").remove();
$(body).append("<%= escape_javascript(render 'product_lightbox', product: @product) %>");

_product_lightbox.html.erb

<%# ******LIGHTBOX******* %>
<div id="product_popup_<%= @product.id %>" class="product_popup" data-popid="<%= @product.id %>">
  <div class="related-products">
      <ul class="related_products_list" id="related_products_list_<%= @product.id %>" data-listid="<%= @product.id %>">
     <% @related_products.each do |related_product| %>
     <li class="related_products_item"><%= link_to large_image(related_product, :itemprop => "image", :data => {:imageid => related_product.id}, :id => "related_" + related_product.id.to_s, :class => "related_products_image dimmed"), url_for(related_product) %></li>
     <% end %>
</ul>
    </div>
    <div class="popup-image">
    <%= large_image(product, :itemprop => "image", :class => "product-image-popup") %>
<%= render 'shared/cart_form' %>
</div><!-- popup-image -->

但是在您的问题中,您实际上并没有明确说明您遇到了什么问题。您是否尝试过仅在灯箱代码中渲染部分内容? :/

编辑 - 根据您的错误,@product 为零。因此,在部分渲染购物车之前,请设置 &lt;% @product = product %&gt;,因为您的灯箱代码看起来使用了 product。否则,只需从控制器向下使用@product,然后您就可以拥有渲染部分都使用@product 的视图。

再次编辑 - 或者,将产品对象作为本地对象传递给您的部分,例如:&lt;%= render 'bla', :product =&gt; product %&gt; 并编辑为部分以使用 product 而不是 @product

【讨论】:

  • 我已经尝试渲染部分,我得到一堆 NoMethod 错误,因为产品模型比我试图显示部分的分类模型具有更多的模型关联。
  • 尝试将您的实际错误信息放在您的问题中。只是说您收到“一堆 NoMethod 错误”并没有任何帮助!只要您使用正确的对象,关联就无关紧要..
  • NoMethodError in Spree/taxons#show Showing /home/telegraph/telegraph1/pants.telegraphbranding.com/app/views/spree/shared/_cart_form.html.erb where line #4 raise: undefined method `has_variants?对于 nil:NilClass 提取的源代码(第 4 行附近): 4: 5:
    6:
    7 :
    • 非常感谢! 解决了问题!
    • 对不起...最后一个问题。当我执行&lt;% @product = product %&gt; 时,它会将taxons#show 页面上每个产品的主图像更改为相同的图像,因为每个产品都使用product 来提取图像。另外,当我将灯箱放入部分并调用时,我收到“堆栈级别太深”错误?
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签