ruby on rails - इंजन से फ़ैक्टरी लड़की कारखानों का उपयोग 4 रेल करता है



ruby-on-rails ruby-on-rails-4 (1)

मुझे सबसे आसान रास्ता मिल गया, जिसके साथ यह एक स्थापित जनरेटर जोड़ने वाला था जो बस कारखानों को प्रतियां कॉपी करता है। मेरे पास भी जनरेटर स्थापित माइग्रेशन रैक कार्य चलाते हैं क्योंकि मुझे इन्हें इंजन के उपयोग करने वाले किसी भी एप्लिकेशन में आवश्यकता होगी।

इसलिए, lib/generators/my_engine/install/install_generator.rb :

module MyEngine
    module Generators
        class InstallGenerator < Rails::Generators::Base
          source_root File.expand_path('../templates', __FILE__)

          def copy_migrations
            rake("my_engine:install:migrations")
          end

          def copy_factories
            copy_file "../path/to/spec/factories.rb", "spec/factories.rb"
          end

        end
    end
end

अब इस इंजन का उपयोग करने वाली परियोजनाओं में, मैं बस rails generate my_engine:install चलाता हूं rails generate my_engine:install और कारखानों (और माइग्रेशन) मेरे लिए उपयोग करने के लिए तैयार हैं।

मैंने कई रेल एप्लिकेशन के मॉडल को मॉडल प्रदान करने के लिए एक रेल इंजन (पूर्ण, माउंट करने योग्य नहीं) बनाया है मैं इस इंजन का परीक्षण करने के लिए फैक्टरी गर्ल रेल का उपयोग करता हूं और सभी परीक्षण इंजन के लिए ठीक चलते हैं

अब मैं इन एप्लिकेशंस में इन इंजनों का उपयोग करने में सक्षम होना चाहता हूं।

Gemspec के लिए निर्भरताएं इस प्रकार दिखती हैं:

s.add_dependency "rails", "~> 4.0.3"
s.add_dependency "mysql2", "~> 0.3.15"

s.add_development_dependency "rspec-rails", "~> 3.0.0.beta"
s.add_development_dependency "factory_girl_rails", "~> 4.4.1"
s.add_development_dependency "shoulda-matchers", "~> 2.5.0"

और मैंने /spec/factories.rb में मेरे कारखानों को परिभाषित किया है:

factory :user do
  ...
end

फैक्टरी लड़की में परिभाषा पथों के कारखानों को जोड़ने के लिए। आरबी, मैंने अपनी / lib/engine_name/engine.rb फ़ाइल में निम्नलिखित को जोड़ा:

class Engine < ::Rails::Engine

    initializer "model_core.factories", :after => "factory_girl.set_factory_paths" do
      FactoryGirl.definition_file_paths << File.expand_path('../../../spec/factories.rb', __FILE__) if defined?(FactoryGirl)
    end

end

मेरे रेल ऐप्स में मैं निम्नलिखित को जेमफाइल में जोड़कर इंजन को शामिल करता हूं:

gem 'engine_name', git: "<GIT_LOCATION>"

मैं ऐप में फ़ैक्टरी_ग्रेड_आरिल भी जोड़ता हूं (क्या यह एक तरीका है कि मैं इंजन से इसे उजागर कर सकता हूं? ऐप में यह निर्दिष्ट करने के बजाय कि मैं भी गैमेफ़ाइल भी?)।

और spec_helper.rb में फ़ैक्टरी लड़की रेल की आवश्यकता होती है:

require 'factory_girl_rails'

अब जब मैं लिखता हूँ, कहते हैं, एक नियंत्रक परीक्षण निम्न की तरह है:

it "saves the user to the database" do
  expect{post :create, user: attributes_for(:user)}.to change{User.count}.by(1)
end

मुझे त्रुटि मिलती है: "फ़ैक्टरी पंजीकृत नहीं है: उपयोगकर्ता"

मैंने रूबी कंसोल खोलकर FactoryGirl.definition_file_paths को खोलकर कारखाने की लड़की परिभाषा फ़ाइल पथ की डबल जांच की है और मैं उत्पादन में इंजन से कारखानों को देख सकता हूं। FactoryGirl.definition_file_paths : "/ home / ... ... gems / engine-name- abc123 / कल्पना / factories.rb "

क्या इन कारखानों को उपलब्ध कराने के लिए मुझे कुछ और करना है?

(मुझे स्टैकहोवरफ्लो पर और उससे भी कुछ समान प्रश्न मिल चुके हैं जो सभी इंजन.आरबी में उन पंक्तियों को जोड़ने या कारखानों में नामस्थान निर्दिष्ट करने के लिए इंगित होते हैं। आरबी लेकिन मैं इस इंजन के साथ नामस्थान का उपयोग नहीं कर रहा हूं।)