按字母顺序排序分类单元(品牌)

时间:2012-01-12 20:58:04

标签: ruby-on-rails spree

Rails noob试图在客户的Spree商店中调整一些东西。

侧边栏需要包含产品品牌列表,我将品牌作为分类。

我的shared/_taxonomies.html.erb视图包含:

  <% get_taxonomies.each do |taxonomy| %>
    <% if taxonomy.name == 'Brand' %>
      <h3 class='taxonomy-root'><%= t(:shop_by_taxonomy, :taxonomy => taxonomy.name.singularize) %></h3>
      <%= taxons_tree(taxonomy.root, @taxon, Spree::Config[:max_level_in_taxons_menu] || 1) %>
    <% end %>
  <% end %>

我添加了if taxonomy.name == 'Brand'代码以摆脱类别。 (我希望有一种更清洁的方式?)

如何按字母顺序列出分类单元(品牌)?

狂欢0.70.3。

1 个答案:

答案 0 :(得分:4)

设置

要好得多
@brand_taxonomy = Taxonomy.where(:name => 'Brand').first

在一个公共控制器中,如果分类法显示在大多数/所有页面上,很可能是application_controller.rb,然后就去:

<h3 class='taxonomy-root'><%= t(:shop_by_taxonomy, :taxonomy => @brand_taxonomy.name.singularize) %></h3>
<%= taxons_tree(@brand_taxonomy.root, @taxon, Spree::Config[:max_level_in_taxons_menu] || 1) %>

因此完全消除了循环和条件。

不幸的是taxons_tree助手会直接调用顶级分类法的子代,所以为了让孩子按名字排序,你必须重写助手,比如application_helpers.rb

def my_taxons_tree(root_taxon, current_taxon, max_level = 1)
  return '' if max_level < 1 || root_taxon.children.empty?
  content_tag :ul, :class => 'taxons-list' do
    root_taxon.children.except(:order).order(:name).map do |taxon|
      css_class = (current_taxon && current_taxon.self_and_ancestors.include?(taxon)) ? 'current' : nil
      content_tag :li, :class => css_class do
       link_to(taxon.name, seo_url(taxon)) + 
       taxons_tree(taxon, current_taxon, max_level - 1) 
      end
    end.join("\n").html_safe
  end
end

关键的变化是在帮助者的子检索中增加了.except(:order).order(:name)

最终的视图代码如下:

<h3 class='taxonomy-root'><%= t(:shop_by_taxonomy, :taxonomy => @brand_taxonomy.name.singularize) %></h3>
<%= my_taxons_tree(@brand_taxonomy.root, @taxon, Spree::Config[:max_level_in_taxons_menu] || 1) %>

并在application_controller.rb中添加:

before_filter :set_brand_taxonomy

def set_brand_taxonomy
  @brand_taxonomy = Taxonomy.where(:name => 'Brand').first
end

我自己没有在Spree项目中实现这个,这取决于你使用Rails 3.0.3+版本,但这是我建议的基本方法。