【问题标题】:Can't display all products无法显示所有产品
【发布时间】:2016-04-06 15:05:44
【问题描述】:

我正在使用 Spree Commerce 开发 Rails 应用程序。

我试图在分类单元中显示所有产品,因为我不是将它们用作类别,而是用作某种注册表。

所以,我正在编辑 /app/views/spree/taxons/show.html.erb。特别是这一行:

<%= render partial: 'spree/shared/products', locals: { products: @products, taxon: @taxon } %>

改成:

<%= render :partial => 'spree/shared/products', :locals => { :products => @products } %>

但它仍然显示“未找到产品”。但在我的索引中显示了它们。

那么,我怎样才能正确地展示所有产品呢?

提前致谢。

ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
Rails 4.2.5
Spree 3.0.4

根据要求:

1) 这是产品展示

<% @body_id = 'product-details' %>

<% cache [I18n.locale, current_currency, @product, @product.possible_promotions] do %>
  <div data-hook="product_show" itemscope itemtype="https://schema.org/Product">
    <div class="col-md-4" data-hook="product_left_part">
      <div data-hook="product_left_part_wrap">
        <div id="product-images" data-hook="product_images">
          <div id="main-image" class="panel panel-default" data-hook>
            <div class="panel-body text-center">
              <%= render :partial => 'image' %>
            </div>
          </div>
          <div id="thumbnails" data-hook>
            <%= render :partial => 'thumbnails' %>
          </div>
        </div>

        <div data-hook="product_properties">
          <%= render :partial => 'properties' %>
        </div>

        <div data-hook="promotions">
          <%= render :partial => 'promotions' %>
        </div>
      </div>
    </div>

    <div class="col-md-8" data-hook="product_right_part">
      <div data-hook="product_right_part_wrap">
        <div id="product-description" data-hook="product_description">
          <h1 class="product-title" itemprop="name"><%= @product.name %></h1>

          <div class="well" itemprop="description" data-hook="description">
            <%= product_description(@product) rescue Spree.t(:product_has_no_description) %>
          </div>

          <div id="cart-form" data-hook="cart_form">
            <%= render :partial => 'cart_form' %>
          </div>
        </div>

        <%= render :partial => 'taxons' %>
      </div>
    </div>
  </div>
<% end %>

2) 从分类单元显示

<h1 class="taxon-title"><%= @taxon.name %></h1>

<% content_for :sidebar do %>
  <div data-hook="taxon_sidebar_navigation">
    <%= render partial: 'spree/shared/taxonomies' %>
    <%= render partial: 'spree/shared/filters' if @taxon.leaf? %>
  </div>
<% end %>

<div data-hook="taxon_products">
  <%= render partial: 'spree/shared/products', locals: { products: @products, taxon: @taxon } %>
</div>

<% unless params[:keywords].present? %>
  <div data-hook="taxon_children">
    <% cache [I18n.locale, @taxon] do %>
      <%= render partial: 'taxon', collection: @taxon.children %>
    <% end %>
  </div>
<% end %>

3) 这就是我在索引中呈现的方式

<div data-hook="homepage_products">
  <% cache(cache_key_for_products) do %>
    <%= render :partial => 'spree/shared/products', :locals => { :products => @products } %>
  <% end %>
</div>

4) _products.html.erb

<%
  paginated_products = @searcher.retrieve_products if params.key?(:keywords)
  paginated_products ||= products
%>

<% content_for :head do %>
  <% if paginated_products.respond_to?(:num_pages) %>
    <%= rel_next_prev_link_tags paginated_products %>
  <% end %>
<% end %>

<div data-hook="products_search_results_heading">
  <% if products.empty? %>
    <div data-hook="products_search_results_heading_no_results_found">
      <%= Spree.t(:no_products_found) %>
    </div>
  <% elsif params.key?(:keywords) %>
    <div data-hook="products_search_results_heading_results_found">
      <h6 class="search-results-title"><%= Spree.t(:search_results, keywords: h(params[:keywords])) %></h6>
    </div>
  <% end %>
</div>

<% if products.any? %>
  <div id="products" class="row" data-hook>
    <% products.each do |product| %>
      <% url = spree.product_url(product, taxon_id: @taxon.try(:id)) %>
      <div id="product_<%= product.id %>" class="col-md-3 col-sm-6 product-list-item" data-hook="products_list_item" itemscope itemtype="https://schema.org/Product">
        <div class="panel panel-default">
          <% cache(@taxon.present? ? [I18n.locale, current_currency, @taxon, product] : [I18n.locale, current_currency, product]) do %>
            <div class="panel-body text-center product-body">
              <%= link_to small_image(product, itemprop: "image"), url, itemprop: 'url' %><br/>
              <%= link_to truncate(product.name, length: 50), url, class: 'info', itemprop: "name", title: product.name %>
            </div>
            <div class="panel-footer text-center">
              <span itemprop="offers" itemscope itemtype="https://schema.org/Offer">
                <span class="price selling lead" itemprop="price"><%= display_price(product) %></span>
              </span>
            </div>
          <% end %>
        </div>
      </div>
    <% end %>
    <% reset_cycle("classes") %>
  </div>
<% end %>

<% if paginated_products.respond_to?(:num_pages) %>
  <%= paginate paginated_products, theme: 'twitter-bootstrap-3' %>
<% end %>

控制器索引:

module Spree
  class HomeController < Spree::StoreController
    helper 'spree/products'
    respond_to :html

    def index
      @searcher = build_searcher(params.merge(include_images: true))
      @products = @searcher.retrieve_products
      @taxonomies = Spree::Taxonomy.includes(root: :children)
    end
  end
end

【问题讨论】:

  • 你能显示与你的索引页面相关的控制器方法(产品所在的位置)吗?
  • 刚刚添加。在底部

标签: ruby-on-rails ruby ruby-on-rails-4 spree


【解决方案1】:

转到spree/frontend/app/controllers/spree/taxons_controller.rb

使show 方法看起来像这样

    def show
      @taxon = Taxon.friendly.find(params[:id])
      return unless @taxon

      @searcher = build_searcher(params.merge(include_images: true))
      @products = @searcher.retrieve_products
      @taxonomies = Spree::Taxonomy.includes(root: :children)
    end

【讨论】:

  • @searcher =build_searcher(build_searcher(params.merge(include_images: true)))
【解决方案2】:

首先,您的文件应命名为_products.html.erb

但它仍然显示“未找到产品”

第二,你能给我们看看这个文件吗?

但在我的索引中显示了它们。

您能否向我们展示一下您如何在索引中呈现您的产品?

编辑:似乎在Taxons#show 中,@products 实例变量未设置。检查您是否在 TaxonsController 的 show 操作中设置了它。

【讨论】:

  • 您在/app/views/spree/shared/ 中有一个名为_products.html.erb 的文件吗?如果有,我们能看到吗?
  • def show @taxon = Taxon.friendly.find(params[:id]) return unless @taxon @searcher = build_searcher(params.merge(taxon: @taxon.id, include_images: true)) @products = @searcher.retrieve_products @taxonomies = Spree::Taxonomy.includes(root: :children) end
  • 你应该在@products 部分之前binding.pry 看看它是否返回了一些东西,因为我怀疑它是空的。
【解决方案3】:

实际上,我正在寻找“未找到产品”的答案 这是我的问题链接: Spree Commerce:未找到产品 Spree Commerce: No Products Found

我刚刚加入 stackoverflow.com 几分钟,无法对以上答案添加评论。

这里是/controllers/spree/taxons_controller.rb:

module Spree

类 TaxonsController

respond_to :html

def show
  @taxon = Taxon.friendly.find(params[:id])
  return unless @taxon

  @searcher = build_searcher(params.merge(taxon: @taxon.id, include_images: true))

  sorting_scope = params[:order].try(:to_sym) || :ascend_by_updated_at

  @taxonomies = Spree::Taxonomy.includes(root: :children)

  @searcher.retrieve_products

  @products = @searcher.retrieve_products



  @curr_page = params[:page] || 1
  @products_per_page = Spree::Config.products_per_page

  @start_no = @curr_page == 1 ? 1 : ((@curr_page.to_i-1)*@products_per_page)+1

  @end_no = @products.length

  if @curr_page.to_i > 1
     @end_no = ( (@curr_page.to_i-1)*@products_per_page) + @end_no
  end

 # @end_no = @product_count <= @product_count ? @product_count : @products.length+(@curr_page.to_i-1)*@products_per_page

end

private

def accurate_title
  @taxon.try(:seo_title) || super
end

结束 结束

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2015-08-14
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多