由default_locale

时间:2015-05-25 09:22:42

标签: ruby-on-rails view rspec locale

我最近对我的Rails应用进行了本地化,并添加了一个默认的“en”区域设置(我按照指示here将区域设置添加到我的网址中)。这打破了我的大多数规格;除了我的View规范之外,我已经能够找到所有这些解决方案/解决方法。

以下是一个基本视图规范的示例,我的文章查看规范:

RSpec.describe 'articles/index', type: :view do
  before(:each) do
    assign(:articles, [
      FactoryGirl.create(:article, number: '11.22.33'),
      FactoryGirl.create(:article, number: '22.33.44')
    ])
  end

  it 'renders a list of articles' do
    render
  end
end

此规范导致以下错误:

 1) articles/index renders a list of articles
     Failure/Error: render
     ActionView::Template::Error:
       No route matches {:action=>"show", :controller=>"articles", :id=>nil, :locale=>#<Article id: 2, number: "11.22.33", criminal_code_id: 3, description: nil, created_at: "2015-05-25 08:58:56", updated_at: "2015-05-25 08:58:56">} missing required keys: [:id, :locale]

似乎有三个问题:

  1. Rspec应该使用动作“index”而不是“show”
  2. “索引”操作
  3. 应该没有必需的:id键
  4. 语言环境应该是“en”而不是我创建的其中一篇文章。
  5. 以下是我的相关路线:

    Rails.application.routes.draw do
      scope ':locale', locale: /#{I18n.available_locales.join("|")}/ do
        resources :articles do
          collection do
            get 'custom_json', constraints: { format: :json }, defaults: { format: :json }
          end
        end
    
        get "*path", to: redirect("/#{I18n.default_locale}") # handles /en/fake/path/whatever
      end
    
      get '', to: redirect("/#{I18n.default_locale}") # handles /
      get '*path', to: redirect("/#{I18n.default_locale}/%{path}") # handles /not-a-locale/anything
    end
    

    这是我的应用程序控制器的相关部分:

    before_action :set_locale
    
    def set_locale
      I18n.locale = params[:locale] || I18n.default_locale
    end
    
    def default_url_options(options = {})
      { locale: I18n.locale }.merge options
    end
    

    我的文章视图位于app / views / articles / index.html.erb(关于它没有什么特别之处)。

    任何人都知道如何让View规格与区域设置相匹配?

2 个答案:

答案 0 :(得分:9)

以下内容可以为您提供帮助:

# Set locale for view specs, see https://github.com/rspec/rspec-rails/issues/255#issuecomment-2865917
class ActionView::TestCase::TestController
  def default_url_options(options = {})
    {locale: I18n.default_locale}
  end
end

# Set locale for feature specs, see https://github.com/rspec/rspec-rails/issues/255#issuecomment-24698753
RSpec.configure do |config|
  config.before(:each, type: :feature) do
    default_url_options[:locale] = I18n.default_locale
  end
end

在我的案例中有所帮助。尽管如此,经过这么多年的Rails I18n之后我仍然不得不关心自己这样的事情。

答案 1 :(得分:0)

在等待某人发布更好的答案时,这是一个潜在的解决方法:

看起来您在索引页面中为每篇文章做了一个link_to。 url helper调用link_to,例如article_path是您的规范可能会破坏的地方。我有一个类似的问题,无法解决它。 url_helper方法在测试环境中对我的工作方式与在dev或prod env中的方式不同。更具体地说,在测试环境中,除非我使用locale:'en'在url_helper调用中显式声明了语言环境,否则它们不起作用。

我环顾四周,无法理解为什么。

所以我决定在我的视图规范中删除对url_helpers的调用,如此

allow(view).to receive(:conversation_transmission_path).and_return("/")
allow(view).to receive(:edit_conversation_transmission_path).and_return("/")

这是rspec 3.2语法