如何将Globalize翻译装置加载到测试模型中?

时间:2015-08-21 10:37:37

标签: ruby-on-rails ruby-on-rails-4 activerecord fixtures globalize

我在Rails 4.1.12中使用gobalize gem 4.0.3。

我有一个Post模型,我运行Post.create_translation_table!提供的globalize迁移来设置post_translations表。

现在我想从夹具文件中自动加载翻译。夹具支持label references for associations所以我有这个:

# spec/fixtures/posts.yml

my_first_post:
  author: dave

# spec/fixtures/post_translations.yml

my_first_post_translation:
  locale: en    
  title: My first post
  content: What a time to be alive!
  post: my_first_post

# spec/models/post_spec

require 'rails_helper'

RSpec.describe Post, type: :model do
  fixtures('post/translations', :posts, :authors)

  subject(:post) { posts(:my_first_post) }

  it "has an author" do
    expect(post.author).to eq(authors(:dave))
  end

  it "has a title" do
    binding.pry
    expect(post.title).to be_present
  end
end

但是运行RSpec会引发以下错误:

 Failure/Error: Unable to find matching line from backtrace
 ActiveRecord::StatementInvalid:
   SQLite3::SQLException: table post_translations has no column named post: INSERT INTO "post_translations" ("locale", "title", "content", "post", "created_at", "updated_at", "id") VALUES ('en', 'My first post', 'This is some compelling english content', 'my_first_post', '2015-08-21 10:23:27', '2015-08-21 10:23:27', 626768522)

如果我做反向(即post_translation: my_first_translation中的posts.yml)会发生类似的错误

我如何获得魔法?

1 个答案:

答案 0 :(得分:11)

解决方案

  1. fixtures/post_translations.yml移至fixtures/post/translations.yml
  2. my_first_translation中关联的关键是globalized_model
  3. 所以你最终会得到这个:

    <!-- language: yml -->
    # spec/fixtures/posts.yml
    
    my_first_post:
      author: dave
    
    # spec/fixtures/post/translations.yml
    
    my_first_post_translation:
      locale: en
      title: My first post
      content: What a time to be alive!
      globalized_model: my_first_post
    

    解释

    1. 翻译模型为Post::Translation。命名空间意味着Post::Translation灯具的位置必须遵循与app/models中的模型相同的嵌套约定。

    2. Post::Translation(以及任何globalize翻译模型)上的关联名称为globalized_modelActiveRecord::FixtureSet uses the association name to recognise the fixture key as an association