有没有人在炼油厂实施了Rails Bootstrap Navbar?
我很难想出如何渲染下拉菜单.
这应该是正确的方法吗?
_menu.html.erb
<% if (roots = local_assigns[:roots] || (collection ||= refinery_menu_pages).roots).present? dom_id ||= 'menu' css = [(css || 'menu'),'clearfix'].flatten.join(' ') hide_children = Refinery::Core.menu_hide_children if hide_children.nil? -%> <div class="navbar"> <div class="navbar-inner"> <div class="container"> <nav id='<%= dom_id %>' class='<%= css %> nav'> <ul class="nav"> <%= render :partial => '/refinery/menu_branch',:collection => roots,:locals => { :hide_children => hide_children,:sibling_count => (roots.length - 1),:menu_levels => local_assigns[:menu_levels],:apply_css => true #if you don't care about class='first' class='last' or class='selected' set apply_css to false for speed. } -%> </ul> </nav> </div> </div> </div> <% end -%>
_menu_branch.html.erb
<% if !!local_assigns[:apply_css] and (classes = custom_menu_branch_css(local_assigns)).any? css = "class='#{classes.join(' ')}'".html_safe end -%> <li class="dropdown"> <% if menu_branch.children.present? && menu_branch.ancestors.length < 1 %> <%= link_to(menu_branch.title,refinery.url_for(menu_branch.url),class: "dropdown-togle",data: { toggle: "dropdown" }) -%> <% else %> <%= link_to(menu_branch.title,refinery.url_for(menu_branch.url)) -%> <% end %> <% if ( (children = menu_branch.children unless hide_children).present? && (!local_assigns[:menu_levels] || menu_branch.ancestors.length < local_assigns[:menu_levels]) ) -%> <ul class="dropdown-menu"> <%= render :partial => '/refinery/menu_branch',:collection => children,:locals => { :apply_css => local_assigns[:apply_css],:hide_children => !!hide_children,:menu_levels => local_assigns[:menu_levels] } -%> </ul> </li> <% end -%>
nav_bar片段
<%= nav_bar :fixed => :top,:brand => "Fashionable Clicheizr 2.0",:responsive => true do %> <%= menu_group do %> <%= menu_item "Home",root_path %> <%= menu_divider %> <%= drop_down "Products" do %> <%= menu_item "Things you can't afford",expensive_products_path %> <%= menu_item "Things that won't suit you anyway",harem_pants_path %> <%= menu_item "Things you're not even cool enough to buy anyway",hipster_products_path %> <% if current_user.lives_in_hackney? %> <%= menu_item "Bikes",fixed_wheel_bikes_path %> <% end %> <% end %> <%= menu_item "About Us",about_us_path %> <%= menu_item "Contact",contact_path %> <% end %> <%= menu_group :pull => :right do %> <% if current_user %> <%= menu_item "Log Out",log_out_path %> <% else %> <%= form_for @user,:url => session_path(:user),html => {:class=> "navbar-form pull-right"} do |f| -%> <p><%= f.text_field :email %></p> <p><%= f.password_field :password %></p> <p><%= f.submit "Sign in" %></p> <% end -%> <% end %> <% end %> <% end %>
解决方法
炼厂2.1.0带引导3
以上的解决方案都没有为我工作.所以我不得不适应情人节Konov的答案.下面你可以找到我的所有文件.如果您需要任何帮助,您可以随时给我留言.开始了!
1)检查您的RefineryCMS和Bootstrap版本
的Gemfile
gem 'bootstrap-sass','~> 3.1.1' gem 'refinerycms','~> 2.1.0'
2)保存几行代码
一个.您实际上并不需要创建一个app / decorators / models / refinery / page_decorator.rb文件.
湾您也可以忘记menu_header方法.这样,你会有:
应用程序/佣工/ application_helper.rb
module ApplicationHelper end
3)现在我们来看看真正的工作
一个.覆盖您的默认标题:
$rake refinery:override view=refinery/_header.html
并将其代码更改为:
应用程序/视图/炼油厂/ _header.html.erb
<nav class="navbar navbar-default" role="navigation"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#"><%=Refinery::Core::site_name %></a> </div> <!-- Collect the nav links,forms,and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <%= Refinery::Pages::MenuPresenter.new(refinery_menu_pages,self).to_html %> </div> </div> </nav>
湾现在去终端运行rake炼油厂:override presenter = refinery / pages / menu_presenter.它将生成一个menu_presenter.rb文件.更改为:
应用/演示/炼油厂/页/ menu_presenter.rb
require 'active_support/core_ext/string' require 'active_support/configurable' require 'action_view/helpers/tag_helper' require 'action_view/helpers/url_helper' module Refinery module Pages class MenuPresenter include ActionView::Helpers::TagHelper include ActionView::Helpers::UrlHelper include ActiveSupport::Configurable config_accessor :roots,:menu_tag,:list_tag,:list_item_tag,:css,:dom_id,:max_depth,:selected_css,:first_css,:last_css,:list_first_css,:list_dropdown_css,:list_item_dropdown_css,:list_item__css,:link_dropdown_options,:carret # self.dom_id = nil # self.css = "pull-left" self.menu_tag = :section self.list_tag = :ul self.list_first_css = ["nav","navbar-nav","navbar-right"] self.carret = '<b class="caret"></b>' self.list_dropdown_css = "dropdown-menu" self.link_dropdown_options = {class: "dropdown-toggle",data: {:toggle=>"dropdown"}} self.list_item_tag = :li self.list_item_dropdown_css = :dropdown self.list_item__css = nil self.selected_css = :active self.first_css = :first self.last_css = :last def roots config.roots.presence || collection.roots end attr_accessor :context,:collection delegate :output_buffer,:output_buffer=,:to => :context def initialize(collection,context) @collection = collection @context = context end def to_html render_menu(roots) if roots.present? end private def render_menu(items) content_tag(menu_tag,:id => dom_id,:class => css) do render_menu_items(items) end end def render_menu_items(menu_items) if menu_items.present? content_tag(list_tag,:class => menu_items_css(menu_items)) do menu_items.each_with_index.inject(ActiveSupport::SafeBuffer.new) do |buffer,(item,index)| buffer << render_menu_item(item,index) end end end end def render_menu_item(menu_item,index) content_tag(list_item_tag,:class => menu_item_css(menu_item,index)) do @cont = context.refinery.url_for(menu_item.url) buffer = ActiveSupport::SafeBuffer.new if check_for_dropdown_item(menu_item) buffer << link_to((menu_item.title+carret).html_safe,"#",link_dropdown_options) else buffer << link_to(menu_item.title,context.refinery.url_for(menu_item.url)) end buffer << render_menu_items(menu_item_children(menu_item)) buffer end end def check_for_dropdown_item(menu_item) (menu_item!=roots.first)&&(menu_item_children(menu_item).count > 0) end # Determines whether any item underneath the supplied item is the current item according to rails. # Just calls selected_item? for each descendant of the supplied item # unless it first quickly determines that there are no descendants. def descendant_item_selected?(item) item.has_children? && item.descendants.any?(&method(:selected_item?)) end def selected_item_or_descendant_item_selected?(item) selected_item?(item) || descendant_item_selected?(item) end # Determine whether the supplied item is the currently open item according to Refinery. def selected_item?(item) path = context.request.path path = path.force_encoding('utf-8') if path.respond_to?(:force_encoding) # Ensure we match the path without the locale,if present. if %r{^/#{::I18n.locale}/} === path path = path.split(%r{^/#{::I18n.locale}}).last.presence || "/" end # First try to match against a "menu match" value,if available. return true if item.try(:menu_match).present? && path =~ Regexp.new(item.menu_match) # Find the first url that is a string. url = [item.url] url << ['',item.url[:path]].compact.flatten.join('/') if item.url.respond_to?(:keys) url = url.last.match(%r{^/#{::I18n.locale.to_s}(/.*)}) ? $1 : url.detect{|u| u.is_a?(String)} # Now use all possible vectors to try to find a valid match [path,URI.decode(path)].include?(url) || path == "/#{item.original_id}" end def menu_items_css(menu_items) css = [] css << list_first_css if (roots == menu_items) css << list_dropdown_css if (roots != menu_items) css.reject(&:blank?).presence end def menu_item_css(menu_item,index) css = [] css << list_item_dropdown_css if (check_for_dropdown_item(menu_item)) css << selected_css if selected_item_or_descendant_item_selected?(menu_item) css << first_css if index == 0 css << last_css if index == menu_item.shown_siblings.length css.reject(&:blank?).presence end def menu_item_children(menu_item) within_max_depth?(menu_item) ? menu_item.children : [] end def within_max_depth?(menu_item) !max_depth || menu_item.depth < max_depth end end end end