Twitter引导Rails 3中的语言环境选择器下拉列表

我在一般的Bootstrapped Rails 3应用程序中有一个非Bootstrapped语言环境选择器,我想要Bootstrap-ify。 关于如何在下拉菜单中的表单中创建(我假设)无序列表,我有点难过。

TL; DR转到此问题底部的编辑3以获取已完成的解决方案。

当前代码以下列方式实现:

应用程序/视图/布局/ _header.html.haml

%header.navbar.navbar-fixed-top .navbar-inner .container # ... %nav %ul.nav.pull-right # ... %li= render 'layouts/locale_selector', controller: controller, action: action # (controller, action params passed in from application.html.haml) 

应用程序/视图/布局/ _locale_selector.html.haml

 = form_tag({ controller: controller, action: action }, method: 'get', class: 'locale') do = select_tag 'set_locale', options_for_select(locale_languages, I18n.locale) = hidden_field_tag 'page', params[:page] if params[:page] = submit_tag 'submit' 

应用程序/佣工/ application_helper.rb

 module ApplicationHelper # ... def locale_languages [ [t('locale_selector.en'), 'en'], [t('locale_selector.it'), 'it'], [t('locale_selector.ja'), 'ja'] ] end end 

应用程序/资产/样式表/ bootstrap_and_overrides.css.scss

 # ... .locale { padding-top: 5px; padding-left: 5px; margin: -0.25em; #set_locale { width: 85px; height: 36px; color: $grayLight; border: none; background: none; text-align: center; &:hover { color: $white; text-decoration: none; } } } 

应用程序/资产/ JavaScript的/ application.js.coffee

 $ -> $(".locale input").hide() $("#set_locale").change -> $(this).closest("form").submit() 

通过阅读Bootstrap组件文档,我已将header.html.haml更改为下面的代码,以获取显示我想要的下拉列表,但是它正在获取select_tag的内容, options_for_select等正确显示/工作我’我不确定:

应用程序/视图/布局/ _header.html.haml

 # ... %li#fat-menu.dropdown %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} = t('.language') %b.caret .dropdown-menu = render 'layouts/locale_selector', controller: controller, action: action 

我试图在表单上的Bootstrap文档中查找信息,并通过搜索StackOverflow和Google,但无济于事。 我打赌我错过了一些简单和/或微不足道的东西,但任何Bootstrap专家都可以帮助我吗?

编辑

更改了2个文件以使下拉列表看起来不错,但它仍然没有提交…

应用程序/佣工/ application_helper.rb

 module ApplicationHelper # ... def locale_languages [ { label: t('locale_selector.en'), locale: 'en' }, { label: t('locale_selector.it'), locale: 'it' }, { label: t('locale_selector.ja'), locale: 'ja' } ] end end 

应用程序/视图/布局/ _locale_selector.html.haml

 = form_tag({ controller: controller, action: action }, method: 'get', class: 'locale') do - locale_languages.each do |language| %li= link_to language[:label], '#', value: language[:locale] = hidden_field_tag 'page', params[:page] if params[:page] = submit_tag 'submit' 

编辑2

应用程序/资产/ JavaScript的/ application.js.coffee

 $ -> $(".locale input").hide() $(".locale").click -> $(this).closest("form").submit() 

现在它提交了,但是我在ApplicationController中对params[:set_locale]所有原始后端处理都被破坏了(不会把代码放在这里,但是对于这里的好奇心),所以语言环境不会改变。 需要尝试params[:set_locale]传回params[:set_locale]值…

编辑3:完成的解决方案

完全摆脱了forms,我应该首先完成,正如@simbirsk和@quick_brown_fox所指出的那样。 非常感谢,伙计们。 这是最终的代码:

应用程序/视图/布局/ _header.html.haml

 %header.navbar.navbar-fixed-top .navbar-inner .container # ... %nav %ul.nav.pull-right # ... %li= render 'layouts/locale_selector', controller: controller, action: action # (controller, action params passed in from application.html.haml) 

应用程序/视图/布局/ _locale_selector.html.haml

 %li#fat-menu.dropdown %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} = t('.language') %b.caret %ul.dropdown-menu - locale_languages.each do |language| %li = link_to language[:label], controller: controller, action: action, set_locale: language[:locale], page: params[:page] 

应用程序/佣工/ application_helper.rb

 module ApplicationHelper # ... def locale_languages [ { label: t('locale_selector.en'), locale: 'en' }, { label: t('locale_selector.it'), locale: 'it' }, { label: t('locale_selector.ja'), locale: 'ja' } ] end end 

app / assets / stylesheets / bootstrap_and_overrides.css.scssapp / assets / javascripts / application.js.coffee中提到的代码已被完全删除,因为它变得多余了。

更新 :这似乎获得了很多观点,所以:

  • 您可以在我为Michael Hartl的Rails教程制作的应用程序中找到语言环境下拉列表的完整实现,包括控制器中的代码

您的解决方案看起来很棒,但不幸的是,它不是Bootstrap原生的。
如文档中所述,导航栏下拉列表的标记如下:

  

因此,如果您想保持“Bootstraped”,请调整您的代码并生成(如果您愿意的话)包含每种语言链接的

  • 集合。 您可以使用<%= link_to %>发布所需的任何数据

    我认为没有办法通过Bootstrap将元素设置为下拉列表。 如何在无序列表中使用链接而不是使用表单,可能会稍微改变一下控制器?

    或者 – 如果这不是解决方案,你可能不得不使用一些JavaScript魔法或创建某种POST链接(我现在不是很关注Rails如何记住你是如何做到这一点的,但你可以,对吧?)

    (不确定我的问题是否正确……)