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.scss和app / assets / javascripts / application.js.coffee中提到的代码已被完全删除,因为它变得多余了。
更新 :这似乎获得了很多观点,所以:
- 您可以在我为Michael Hartl的Rails教程制作的应用程序中找到语言环境下拉列表的完整实现,包括控制器中的代码
您的解决方案看起来很棒,但不幸的是,它不是Bootstrap原生的。
如文档中所述,导航栏下拉列表的标记如下:
因此,如果您想保持“Bootstraped”,请调整您的代码并生成(如果您愿意的话)包含每种语言链接的
集合。 您可以使用<%= link_to %>
发布所需的任何数据
我认为没有办法通过Bootstrap将元素设置为下拉列表。 如何在无序列表中使用链接而不是使用表单,可能会稍微改变一下控制器?
或者 – 如果这不是解决方案,你可能不得不使用一些JavaScript魔法或创建某种POST链接(我现在不是很关注Rails如何记住你是如何做到这一点的,但你可以,对吧?)
(不确定我的问题是否正确……)
- 在heroku上托管的Rails应用程序:错误R12(退出超时)
- Ruby on Rails。 捆绑。 黄瓜。 耙子流产了! 命令失败,状态为(1)
- 使用Sidekiq进行活动作业并获取ActiveJob :: DeserializationError
- rails_admin dashboard / secondary_navigation customization
- 设计skip_confirmation! 不工作
- 具有恢复能力的文件上传(最好在Ruby on Rails中)
- time_select,在Ruby on Rails上有12小时的时间和时区
- 为字段创建PostgreSQL序列(不是记录的ID)
- 设计如何将当前用户关联到post?