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。
答案 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+版本,但这是我建议的基本方法。