5

使用 rails 3.2.13 和 spree 2.0.2
我遇到了与动态范围下的 Rails mountable engine类似的问题

我的路线:

scope ':locale', locale: /en|jp/ do
  mount Spree::Core::Engine, at: '/store'
  root to: 'home#index'
end

我想输出链接以更改语言环境:

<%= link_to 'JP', url_for(locale: :jp) %>

但这输出:

<a href="/en/store/?locale=jp">JP</a>

而不是预期的:

<a href="/jp/store">JP</a>

- 编辑 -

当我把ApplicationController

def default_url_options(options={})
  { locale: I18n.locale }
end

它在 store 中设置 locale 参数两次而不是合并它们:

http://localhost:3000/en/store/products/bag?locale=en
4

2 回答 2

1

面临完全相同的问题,我已经找到了解决方案......

这是我的 application_controller-File (我的引擎从这个文件继承(这是主应用程序 ApplicationController,所以我没有代码重复)

#!/bin/env ruby
# encoding: utf-8
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  before_filter :set_locale_from_params

  def url_options
    { locale: I18n.locale }
  end

  protected
    def set_locale_from_params
      if params[:locale]
        if I18n.available_locales.include?(params[:locale].to_sym)
          I18n.locale = params[:locale]
        else
          flash.now[:notice] = 'Translation not available'
          logger.error flash.now[:notice]
        end
      end
    end
end

请注意,url_options-code 在受保护的部分之外。它必须是公开的。

在此处找到解决方案的提示: default_url_options 和 rails 3

希望能帮助到你

问候

菲利普

于 2013-08-18T14:12:33.300 回答
0

为 Spree 等引擎设置 default_url_options。您需要定位引擎并设置参数。

例如,设置主机

    # config/environment/development.rb
 
    Spree::Core::Engine.routes.default_url_options[:host] = "localhost:3000"
于 2021-12-08T21:11:07.547 回答