6

我觉得我错过了一些非常简单的东西,我一直在这个问题上旋转我的轮子。

我目前在我的应用程序中进行国际化工作。翻译工作正常,路线工作完美。至少,除了指向我的两个静态页面(我的“关于”和“常见问题”页面)的路由之外,大多数站点都可以正常工作。

整个应用程序中的所有其他链接都指向正确的本地化路线。例如,如果我选择“法语”作为我的语言,链接会指向相应的“(/:locale)/controller(.:format)”。然而,尽管我在整个应用程序中进行了更改,但“关于”和“常见问题解答”的链接拒绝指向“../fr/static/about”并且始终指向“/static/about”。

更奇怪的是,当我运行 rake 路由时,我看到:“GET (/:locale)/static/:permalink(.:format) pages#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

我的应用程序控制器:

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

我会非常感谢任何帮助......这只是那些日子之一。

编辑:感谢特里让我慢跑以包含视图。

<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>
4

2 回答 2

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控制台命令。

祝你好运!

于 2013-08-02T20:09:48.080 回答
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/静态/常见问题” - 纠正:

   <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>

现在继续讨论另一个问题,但如果有人有更优雅的方式来做这件事,请随时贡献。可能会在下周初重新审视这个问题。

于 2013-08-01T20:40:06.573 回答