我觉得我错过了一些非常简单的东西,而且我一直在努力解决这个问题。
我目前在整个应用程序中都有国际化工作。翻译工作和路线完美运作。至少,除了我的两个静态页面的路线,我的“关于”和“常见问题”页面之外,大多数网站都有效。
整个应用程序中的每个其他链接都指向正确的本地化路由。例如,如果我选择“french”作为我的语言,链接指向相应的“(/:locale)/controller(.:format)。”但是,尽管我在整个应用程序中进行了更改,但我的“关于”和“常见问题解答”的链接拒绝指向“../fr/static/about”并始终指向“/ static / about。”
为了使事情变得更加奇怪,当我运行rake路线时,我看到: “GET(/:locale)/static/:permalink(.:format)页面#show {:locale => / en | fr /}”
当我手动输入“../fr/static/about”时,页面会完美翻译。
我的路线档案:
devise_for :users
scope "(:locale)", :locale => /en|fr/ do
get 'static/:permalink', :controller => 'pages', :action => 'show'
resources :places, only: [:index, :show, :destroy]
resources :homes, only: [:index, :show]
match '/:locale' => 'places#index'
get '/'=>'places#index',:as=>"root"
end
我的ApplicationController:
before_filter :set_locale
def set_locale
I18n.locale=params[:locale]||I18n.default_locale
end
def default_url_options(options={})
logger.debug "default_url_options is passed options: #{options.inspect}\n"
{ :locale => I18n.locale }
end
和我的页面控制器:
class PagesController < ApplicationController
before_filter :validate_page
PAGES = ['about_us', 'faq']
def show
render params[:permalink]
end
def validate_page
redirect_to :status => 404 unless PAGES.include?(params[:permalink])
end
end
我会非常感谢任何帮助......这只是其中的一天。
编辑:感谢Terry让我慢慢加入视图。
<div class="container-fluid nav-collapse">
<ul class="nav">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><%= t(:'navbar.about') %><b class="caret"></b></a>
<ul class="dropdown-menu">
<li><%=link_to t(:'navbar.about_us'), "/static/about_us"%></li>
<li><%=link_to t(:'navbar.faq'), "/static/faq"%></li>
<li><%=link_to t(:'navbar.blog'), '#' %></li>
</ul>
</li>
答案 0 :(得分:4)
您应该通过“as”为您的路线命名:
scope "(:locale)", :locale => /en|fr/ do
get 'static/:permalink', to: 'pages#show', as: :static
然后在视图中构建与路由助手( route_name _path)的链接:
<li><%=link_to t('navbar.about_us'), static_path(permalink: "about_us") %></li>
此助手会自动将当前区域设置添加到路径。
要获取名称使用 rake routes console命令的所有路由的列表。
祝你好运!答案 1 :(得分:1)
有趣。通过在视图中使用url_for结束解决此问题:
<div class="container-fluid nav-collapse">
<ul class="nav">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><%= t(:'navbar.about') %><b class="caret"></b></a>
<ul class="dropdown-menu">
<li><%=link_to t(:'navbar.about_us'), url_for('static/about_us')%></li>
<li><%=link_to t(:'navbar.faq'), url_for('static/faq')%></li>
<li><%=link_to t(:'navbar.blog'), '#' %></li>
</ul>
</li>
我个人从未使用过url_for,所以我不确定这是否是最优雅的解决方案,但我很高兴它能够正常使用!
编辑: 实际上回到代码,这产生了一个非常糟糕的结果。它起源于root_url和大多数其他路径,但是如果当前路径是/ fr / static / about_us或/ fr / static / faq,则上面的行实际上称为“/ fr / static / static / about_us”或“/ fr / static / static / faq“ - 纠正:
<ul class="dropdown-menu">
<% if request.fullpath == '/fr/static/about_us' or request.fullpath == '/fr/static/faq' %>
<li><%=link_to t(:'navbar.about_us'), url_for('/fr/static/about_us')%></li>
<li><%=link_to t(:'navbar.faq'), url_for('/fr/static/faq')%></li>
<li><%=link_to t(:'navbar.blog'), '#' %></li>
<% elsif request.fullpath == '/en/static/about_us' or request.fullpath == '/en/static/faq' %>
<li><%=link_to t(:'navbar.about_us'), url_for('/en/static/about_us')%></li>
<li><%=link_to t(:'navbar.faq'), url_for('/en/static/faq')%></li>
<li><%=link_to t(:'navbar.blog'), '#' %></li>
<% elsif request.fullpath == '/static/about_us' or request.fullpath == '/static/faq' %>
<li><%=link_to t(:'navbar.about_us'), url_for('/en/static/about_us')%></li>
<li><%=link_to t(:'navbar.faq'), url_for('/en/static/faq')%></li>
<li><%=link_to t(:'navbar.blog'), '#' %></li>
<% else %>
<li><%=link_to t(:'navbar.about_us'), url_for('static/about_us')%></li>
<li><%=link_to t(:'navbar.faq'), url_for('static/faq')%></li>
<li><%=link_to t(:'navbar.blog'), '#' %></li>
<%end%>
</ul>
现在继续讨论另一个问题,但是如果有人有更优雅的方式做到这一点,请随时贡献。可能会在下周初重新审视这个问题。