Tag: rails engines

Rails引擎呈现视图

我有一个我正在开发的导轨引擎。 这是我的第一个,除了rails文档中的示例,所以我没有很好的参考什么有效。 它有一部分我要求应用程序渲染。 这很好。 我理解为什么我需要通过引擎名称空间引用partial。 但在局部内,我显然也必须使用名称空间。 所以当我渲染一张照片时 这是基于文档的反直觉。 我做错了什么,或者只是它的方式? 好的,谢谢Rich Peck,我想我明白了。 让我列举一下,如果我仍然感到困惑,你可以纠正我。 我对如何为引擎生成命名空间感到困惑。 我假设结构生成了名称空间,当你进入引擎时,你就像在普通应用程序中一样操作。 命名空间是自动的:)。 但是如果我理解正确的话,rails组件的名称空间是通过将它们封装在由生成器处理的::::模块EngineName中生成的,但是如果你手动创建文件,那么你需要添加封装在文件中。 由于这是我的第一台发动机,我不知道他们失踪了。 对于Asset管道,命名空间由结构image / enginename / ….生成。 因此,即使在引擎内部,除非您在模块内部,否则您必须遵守命名空间EngineName :: ModelName :: Method。 命名空间不应用于任务文件,似乎不喜欢在模块中封装。 但这仍然是多余的,因为rake任务已经提供了命名空间方法。 Ala namespace :db do 我还惊讶地发现你需要在命名空间控制器ala中手动包含命名空间的应用程序控制器 require_dependency “enginename/application_controller” 但正如里奇所说,引擎只是一个美化的模块,所以我想它偶尔需要一些帮助。 当然,Javascript文件是隔离的,因为它们仅在加载引擎中的一个页面时加载,而不是在引擎的部分内容被渲染时加载。 你可以让引擎的用户在他们的application.js中包含javascript文件,但是然后他们需要手动命名,以避免将它们与其他来源的类似JS混淆。 肯尼斯·特鲁尔斯(Kenneth Truyers)有一个很好的博客,我已经为未来的练习添加了书签 ,也许我现在需要了解它。 所以语言环境不是名称间隔,所以你需要自己做。 很容易添加:engine_name到语言环境文件层次结构ala de :: engine_name:variables我建议为引擎名称添加前缀,例如x,这样就可以避免让用户使用与变量相同的名称来破坏引擎语言环境。 所以xAdmin:会比Admin更好:因为像我这样的人可能会使用Admin:作为管理function的变量:)并发现引擎中的所有本地化突然消失了。 富有,我更接近 现在来扩展我的问题, 我不确定初始化文件是否是命名空间。 apps initializers目录中的enginename.rb文件是否会覆盖引擎初始化目录中具有相同名称的文件? 我假设如果确实如此,我们可以在引擎初始化程序中使用不同的名称,因为我认为它与文件名没有真正的关联,只是簿记。 现在如何在应用程序中扩展模型。 […]

辅助测试中未定义的局部变量或方法“main_app”

我在Rails主应用程序上运行我的帮助程序测试时遇到错误(带有更多插件) 1) MenuHelper maintence menu Failure/Error: before { menu = build_menu_maintence() } NameError: undefined local variable or method `main_app’ for # # ./app/helpers/menu_helper.rb:37:in `eval’ # (eval):1:in `block in build_menu_items’ # ./app/helpers/menu_helper.rb:37:in `eval’ # ./app/helpers/menu_helper.rb:37:in `block in build_menu_items’ # ./app/helpers/menu_helper.rb:23:in `each’ # ./app/helpers/menu_helper.rb:23:in `build_menu_items’ # ./app/helpers/menu_helper.rb:15:in `build_menu’ # ./app/helpers/menu_helper.rb:48:in `build_menu_maintence’ # ./spec/helpers/menu_helper_spec.rb:11:in `block (3 levels) in […]

如何控制器测试rails 4引擎重定向回main_app路由

我在控制器测试我创建的rails引擎时遇到了一些麻烦。 我遇到的问题是我似乎无法让rspec使用main_app路由。 例如,我正在编写以下控制器测试。 如果不是main_app.root_path返回nil,测试将通过。 我在控制器规范中的代码是: context “successful session creation” do let(:user) {FactoryGirl.create :user} it ‘sets user id session’ do get :create, use_route: :authenticatable, email: user.email, password: ‘password’ expect(session[:user_id]).to eq user.id end end end 在我的控制器中,我有: def create user = Authenticatable::User.find_by(email: params[:email]) if user && user.login(params[:password]) session[:user_id] = user.id redirect_to main_app.root_path, notice: “You are signed in!” else […]

Omniauth-Facebook回调不会在Rails可安装引擎中初始化

我正在开发一种可安装的引擎(称为SimpleUser),它使用Devise,OmniAuth和OmniAuth-Facebook。 首先,我用gem做了一个测试应用程序,并且每个工作正常。 接下来,我开始从头开始构建引擎,使用测试应用程序的代码作为示例。 几乎所有事情都已完成,除了与Facebook的连接(它使用Javascript弹出窗口)。 当我点击“登录”时会显示FB弹出窗口,我授予应用程序,它会重定向到指定的路由(请参阅路由),但会抛出此错误: NoMethodError in SimpleUser::AuthController#create undefined method `[]’ for nil:NilClass 该行为发生错误,在行authentication = Authentication.find_by_provider_and_uid(auth[‘provider’], auth[‘uid’]) , auth为nil( auth来自auth = request.env[“omniauth.auth”] )。 我检查的一件事是Callback阶段没有初始化。 这是测试应用的日志: 在2013-03-14 08:52:56 -0600(facebook)开始获取127.0.0.1的GET“/ auth / facebook / callback”。回调阶段已启动。 由AuthController处理#create as HTML参数:{“provider”=>“facebook”} 这是引擎应用程序的日志: Started GET “/simple_user/auth/facebook/callback” for 127.0.0.1 at 2013-03-14 08:51:19 -0600 Processing by SimpleUser::AuthController#create as HTML Parameters: {“provider”=>”facebook”} 为了管理OmniAuth,我将gem添加到.gemspec和Gemfile中; 另外,我需要引擎中的gem,并且在引擎的生成器中我将omniauth.rb的模板移动到安装期间父app的config […]

Rails引擎在外键中出现问题

我正在开发一个rails引擎,这是我的gem.gemspec s.required_ruby_version = ‘>= 2.0.0’ s.add_dependency ‘rails’, ‘>= 4.2.0’ s.add_dependency ‘enumerate_it’ s.add_dependency ‘slim-rails’ s.add_dependency ‘bootstrap-sass’ s.add_dependency ‘jquery-rails’ s.add_development_dependency ‘rdoc’ s.add_development_dependency ‘tomdoc’ s.add_development_dependency ‘sqlite3’ s.add_development_dependency ‘rspec-rails’ s.add_development_dependency ‘timecop’ s.add_development_dependency ‘shoulda-matchers’ s.add_development_dependency ‘factory_girl_rails’ s.add_development_dependency ‘database_cleaner’ s.add_development_dependency ‘awesome_print’ s.add_development_dependency ‘guard’ s.add_development_dependency ‘guard-rspec’ s.add_development_dependency ‘guard-migrate’ s.add_development_dependency ‘guard-livereload’ s.add_development_dependency ‘thor’ s.add_development_dependency ‘simplecov’ s.add_development_dependency ‘codeclimate-test-reporter’ 这是我的迁移文件,当我运行install命令时,它将被复制到我的rails应用程序: class CreateMpaStorySchema < ActiveRecord::Migration def […]

Rails引擎和设计

我有一个Rails引擎,我想在那里使用Devise。 我按照本指南正常安装了装置。 我在我的引擎devise.rb中添加了这个: Devise.setup do |config| config.router_name = :cms_user end 我在路线文件中添加了这个: Cms::User::Engine.routes.draw do devise_for :users, { class_name: ‘Cms::User’, module: :devise } end 我在我的路线中添加了这个: devise_for :users, { class_name: ‘Cms::User’, module: :devise } 但是我一直收到这个错误: undefined method ‘cms_user’ 我究竟做错了什么 ?

Rails 4使用Engine的Factory Girl工厂

我已经创建了一个rails引擎(完整的,不可安装的)来为许多不同的rails应用程序提供模型。 我使用Factory Girl Rails测试这个引擎,测试对于引擎本身都运行良好。 我现在希望能够在包含此引擎的其他应用程序中使用这些工厂。 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 要将factories.rb添加到factory girl中的定义路径,我将以下内容添加到我的/lib/engine_name/engine.rb文件中: class Engine “factory_girl.set_factory_paths” do FactoryGirl.definition_file_paths << File.expand_path('../../../spec/factories.rb', __FILE__) if defined?(FactoryGirl) end end 在我的rails应用程序中,我通过将以下内容添加到Gemfile来包含引擎: gem ‘engine_name’, git: “” 我还将factory_girl_rails添加到应用程序中(有没有一种方法可以从引擎中公开它?而不是必须在应用程序Gemfile中指定它?)。 并且在spec_helper.rb中需要工厂女孩栏: require ‘factory_girl_rails’ […]

如何在Rails 3应用程序中获取所有引擎的列表

根据Rails引擎扩展 Rails 2.x中的function ,可以做到 Rails::Initializer.new(Rails.configuration).plugin_loader.engines 此代码在Rails 3中不起作用 ActionController::RoutingError (undefined method `new’ for Rails::Initializer:Module): config/application.rb:12:in `require_or_load’ 在Rails 3中我需要做什么才能获得这样的引擎列表? 这是在主应用程序中扩展Rails 3引擎的控制器所需的

如何从主机应用程序可用的Rails 3引擎中创建路由?

我有一个Rails 3应用程序,其中包含多个包含其他function的引擎。 每个引擎都是一个单独的服务,客户可以购买访问权限。 但是,我对来自引擎的路径存在问题,这些路由不易用于控制器和视图。 控制器: class ClassroomsController < ApplicationController .. respond_to :html def index respond_with(@classrooms = @company.classrooms.all) end def new respond_with(@classroom = @company.classrooms.build) end .. end app/views/classrooms/new.html.haml : = form_for @classroom do |f| .. f.submit 引擎中的config/routes.rb : MyEngineName::Engine.routes.draw do resources :classrooms end app中的config/routes.rb : Seabed::Application.routes.draw do mount MyEngineName::Engine => ‘/engine’ … end 引擎中的lib/my_engine_name.rb : module […]

我可以从安装它的真实应用程序运行Rails引擎的规范吗?

我有一个Rails引擎,旨在为我们的大型项目提供一些模型和控制器。 引擎的规格相当不错,在引擎的虚拟应用程序中使用了一堆模拟和一些全尺寸模型和控制器,以确保引擎正在做它应该做的事情并使用更大的应用程序。 但是,即使所有测试都通过,我也经常在更大的应用程序中更新引擎时发现损坏的行为。 如果我的测试通过但是行为被破坏了,那么测试显然有些问题,但是什么呢? 我嘲笑太多,还是不够? 为了让我更接近解决这个问题,我希望能够在整个应用程序中运行引擎的测试。 这似乎应该是可能的,但我不完全了解rspec如何处理。 (这与这个问题有关但不完全相同;我不是试图从一个命令运行所有规范,只是为了在完整的应用程序环境中运行引擎的规范。 这似乎也是相关的。实际上,我’我读过用rspec和rails-engines标记的每一个问题 – 这些问题并不多 – 而且它们都不是我需要的,或者没有答案。)