标签: rails-engines

rails 3.1引擎和数据库

rails 3.1引擎可以拥有自己的数据库,同时也可以访问主应用程序的数据库,例如用户身份验证如果可能,我该如何配置?

谢谢

ruby-on-rails rails-engines

4
推荐指数
1
解决办法
3485
查看次数

如何使用RSpec针对真实应用开发Rails3引擎?

关于引擎开发和使用虚拟应用程序进行测试已经写了很多.

在我们的例子中,我们正在开发一个不是独立实体的引擎,但它依赖于真正的Rails 3应用程序.我们仍然希望此代码存在于引擎中,而不是成为应用程序的一部分,因为引擎的工作是从具有自己的表和模型映射的遗留系统导入数据,并且我们希望最终再次删除它.

旧遗留表和新模式之间的数据映射很复杂,我们希望TDD(使用rspec)引擎.

  • 我跟随了Jose Valim的书"Crafting Rails Appliations "并使用了enginex gem.
  • /spec/dummy_app用一个指向真正的Rails 3应用程序的git子模块替换了.
  • 我无法从引擎加载模型(未定义的符号错误),因为真正的应用程序的Gemfile没有指向引擎,我也无法修改config/application.rb,需要引擎(这是虚拟应用程序所做的) ,如本书第15-16页所述.
  • 我将引擎的lib文件夹包含在加载路径$:spec_helper,路径可用.
  • requirespec_helper.rb并没有解决问题.
  • 我想知道是否有内部Rails API(或聪明的猴子补丁)挂钩到真实应用程序的启动序列并需要引擎,而不必修改真实应用程序的代码(因为它在子模块中).
  • 另一个我不完全确定的问题是我有2个Gemfiles(一个在引擎中,一个在应用程序中),当引擎处于活动状态时,它们都应该被使用.

思考?

rspec rails-engines ruby-on-rails-3

4
推荐指数
1
解决办法
917
查看次数

如何正确扩展 Rails Engine 的控制器?

我正在开发名为 Carrier ( https://github.com/stanislaw/carrier ) 的Rails 插件(它是 3.1 引擎)。

在我的一个 rails 应用程序中,我想用一些新方法扩展 Carrier 的控制器 - fx。将新操作 #comment_form 添加到 Carrier::MessagesController(我希望此操作仅存在于我的应用程序中 - 我不想将其添加到引擎中 - 因为它非常具体)。

我在这里看到的两种策略:

1)我将{Carrier's plugin root}/app/controllers/carrier/messages_controller.rb文件复制到我的应用程序的app/controllers/carrier/文件夹中,然后扩展它(所有插件的原始操作也被复制到rails应用程序控制器文件夹中! )。

2)我想要的更准确的方法 - 只是创建 {My rails app}/app/controllers/carrier/messages_controller.rb 并只写#comment_form 方法,我希望 Carrier 扩展。

期望两个控制器的内容(来自插件文件夹+自定义在我的 Rails 应用程序中只有新的#comment_form)会叠加,我尝试了第二种方式。但是 Rails 然后停止识别来自 Carrier 插件文件夹的 messages_controller.rb 中写入的所有原始 Carrier 操作(#index、#show 等...),并开始将 Rails 应用程序的 messages_controller.rb 版本视为唯一一个(所有原始操作都开始处理为空,因此开始通过 Rails 约定的默认流程呈现)。

所以我的一般问题是:如何将新操作添加到 Rails Engines 控制器而不将它们完全复制到 Rails app/controllers 文件夹?

UPD

现在,我看到了两种解决方案,它们允许在没有严重黑客攻击的情况下扩展引擎的控制器(就像这个 gem 所做的那样:https : //github.com/asee/mixable_engines来自这个线程:在主应用程序中扩展 Rails 3 引擎的控制器

1) 在 #{main_app}/app/controller/your_engine 文件夹中的 …

ruby-on-rails ruby-on-rails-plugins rails-engines ruby-on-rails-3.1

4
推荐指数
1
解决办法
3321
查看次数

狂欢作为可安装的引擎

因此,我们希望将我们网站的一部分重新架构为Rails应用程序.最初的计划是拥有一个主要的"站点"应用程序,其中包含许多具有分隔功能的插件应用程序(Rails 3.1引擎) - 商店组件,社交/论坛/聊天组件等.另外,我们想要放置主题/在宝石中设计风格,以便我们的网页设计师可以修改网站外观和一些小的布局调整,而无需"知道Rails".最初,这进展顺利; 我们创建了主要的架构和插件以及主题gem,它们一起玩得很好; 像auth这样的横切功能被置于主"站点"应用程序中,并且可以被插件应用程序使用,为我们提供了一个站点的单点登录(设计要求).

我们对商店组件的初步计划是使用Spree(http://spreecommerce.com/),因为它具有开箱即用的95%以上的功能.然而,有一个问题 - Spree作为可安装的引擎发布,但它也是一个应用程序.这意味着不仅Spree在应用程序内部安装(这不是问题,实际上它是我们依赖的行为),但它取决于对主应用程序的控制.研究这种行为的"原因",似乎取决于两个核心功能.第一块功能是一些SEO永久链接重写功能,必须进入中间件; 我们可以破解东西,以便我们的主要应用程序包含这一大块代码(尽管这将开始纠缠整个网站的商店功能,将"Spree作为可安装的引擎"的故事混淆......稍后会详细介绍).

更复杂的是Spree使用Deface进行主题和定制.虽然这是"聪明"(注意引用),但它确实使Spree整合成了一场噩梦; 要么你遵循阻力最小的道路,要让Spree成为一个完整的商店(这完全打破了我们的故事"商店只是我们网站的一部分,并与网站的其他部分,包括auth,主题等等相得益彰.),或者你必须破解Spree的地狱.

不仅如此,Spree还没有遵循标准的Rails引擎路由范例,其中路由被隔离在引擎根目录下(如果你查看lib的routes.rb文件,你可以看到它使用Rails.Application的路由,而不是引擎的路线).这意味着我们不能拥有www.oursite.com/store/...all_the_spree_goodness,我们必须有www.oursite.com/spree_owns_the_sites_routes ...

那么,还有其他人试过吗?我们喜欢Spree并希望将它用作我们的商店.但它开始看起来没有真正的方法将它与我们网站的其他部分"整合",除了可能有一些代理魔法与nginx或类似的东西(这是一个单独的噩梦,因为我们希望在Heroku上托管,然后我们必须弄清楚如何将多个不同的应用程序集成到一个数据库中 - 用于单点登录身份验证 - 以及HTTP前端路由器).

Spree devs,我们喜欢你的代码,但是有没有做任何工作使它成为一个真正的,真正的 Rails引擎,而不是一个独立的应用程序恰好将其所有功能打包到引擎?如果没有将它集成到现有网站的能力(包括不"拥有"应用程序,能够将所有路由分开,等等),我们就无法使用它:(

TIA.

ruby-on-rails spree rails-engines

4
推荐指数
1
解决办法
1708
查看次数

如何让我的虚拟应用程序使用Engine的模板引擎?

我有一个正在研究的Rails引擎,gemspec有这个:

s.add_development_dependency "rspec-rails"
s.add_development_dependency "combustion"
s.add_development_dependency "capybara"
s.add_development_dependency "factory_girl_rails"
s.add_development_dependency "ffaker"
s.add_development_dependency "draper"
s.add_runtime_dependency "sqlite3"
s.add_runtime_dependency "slim-rails"
s.add_runtime_dependency "sass-rails"
s.add_runtime_dependency "jquery-rails"
s.add_runtime_dependency "rails", "~> 3.2"
Run Code Online (Sandbox Code Playgroud)

但是,在转到正确的控制器/操作后,我收到此错误:

Missing template countdown/subscriptions/index, countdown/application/index with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder]}. Searched in: * "/Users/krainboltgreene/Repository/ruby/countdown/spec/dummy/app/views" * "/Users/krainboltgreene/Repository/ruby/countdown/app/views"
Run Code Online (Sandbox Code Playgroud)

注意处理程序部分?

template-engine ruby-on-rails rails-engines slim-lang

4
推荐指数
2
解决办法
2027
查看次数

多个Rails引擎rspec控制器测试不起作用

我的Rails 4 beta1应用程序中有多个Rails引擎.我rspec-rails为每个引擎安装了gem.我按照命令创建了我的引擎:

rails plugin new store_frontend --dummy-path=spec/dummy -d postgresql --skip-test-unit --mountable
Run Code Online (Sandbox Code Playgroud)

在我的引擎的虚拟应用程序中,我配置了数据库和路由.以下是routes.rb文件的示例:

Rails.application.routes.draw do

  mount StoreFrontend::Engine => "/store"
end
Run Code Online (Sandbox Code Playgroud)

当我在第一个引擎内运行rspec时,我得到以下错误:

  1) StoreAdmin::DashboardController GET 'index' returns http success
     Failure/Error: get 'index'
     ActionController::UrlGenerationError:
       No route matches {:action=>"index", :controller=>"store_admin/dashboard"}
     # ./spec/controllers/store_admin/dashboard_controller_spec.rb:8:in `block (3 levels) in <module:StoreAdmin>'
Run Code Online (Sandbox Code Playgroud)

这是我的控制器测试/它是从Rails /生成的:

require 'spec_helper'

module StoreFrontend
  describe HomeController do

    describe "GET 'index'" do
      it "returns http success" do
        get 'index'
        response.should be_success
      end
    end

  end
end
Run Code Online (Sandbox Code Playgroud)

似乎控制器测试不起作用.我有模型测试,它工作正常.任何的想法?

更新1: 我的申请结构:

bin/
config/
db/
lib/
log/ …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails rails-engines rspec-rails ruby-on-rails-3

4
推荐指数
1
解决办法
3764
查看次数

删除主应用程序中路径助手中对 main_app 前缀的需要

我有一个独立的、可安装的 Rails 引擎,它将自身安装在主机应用程序中已声明的命名空间中。它或多或少看起来是这样的:

插件中的routes.rb:

# my_engine/config/routes.rb 
MyEngine::Engine.routes.draw do
  namespace :admin do
    resources :some_resource
  end
end
Run Code Online (Sandbox Code Playgroud)

以及主机应用程序的routes.rb中的适当片段:

# config/routes.rb
mount MyEngine::Engine, at: "/"

namespace :admin do
  resources :host_resource
end
Run Code Online (Sandbox Code Playgroud)

我正在安装引擎,/因为引擎中应该有一些可用的路由,并且管理命名空间重叠是有意的。

这些路线会生成几个路径助手,包括my_engine.admin_some_resources_path和 我期望的admin_host_resources_path. 后者是行不通的。

假设主应用程序中有一个控制器声明如下:

# app/controllers/admin/application_controller.rb
class Admin::ApplicationController < ApplicationController
  layout 'admin'
end
Run Code Online (Sandbox Code Playgroud)

并且引擎的 AdminController 的声明方式是继承它:

# my_engine/app/controlles/admin/application_controller.rb
class MyEngine::Admin::ApplicationController < Admin::ApplicationController
end
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都按预期进行。现在,假设在主应用程序的admin布局中,从 Admin::ApplicationController 引用,我尝试使用本质上类似的东西:

# app/views/layouts/admin.html.erb
<%= link_to "Host resources", admin_host_resources_path %>
<%= link_to "Plugin's resources", my_engine.admin_some_resources_path %>
Run Code Online (Sandbox Code Playgroud)

当我加载像“/admin/host_resources”这样的路径时,这工作得很好 - 它从主应用程序渲染管理布局没有问题。当打开路径“/admin/some_resources”(进入插件)时,它会停止工作,抱怨 …

rails-engines ruby-on-rails-4

4
推荐指数
1
解决办法
2525
查看次数

独立运行Rails引擎

如果我有一个可安装的Rails引擎,那么将它作为独立应用程序(不属于任何其他应用程序的一部分)安装在某个端点的最小配置是什么?

这最好只是一个简单的Rack应用程序,以便我可以选择一个合适的Web服务器(独角兽,美洲狮等).

ruby rack ruby-on-rails rails-engines

4
推荐指数
1
解决办法
773
查看次数

rails:在引擎的 lib 目录中自动加载文件

我正在使用一个引擎处理这个 rails 应用程序,它是一种子应用程序,向我现有的应用程序添加更多路由。

由于 Rails,这个概念是如此强大。

但是我面临着在开发模式下在我的引擎 lib 目录中自动加载文件更改的奇怪挑战。每次我在引擎的 app 目录中进行更改时,无论是 model 还是 controller ,它都可以完美运行,但不会对 lib 目录下的任何文件进行更改。有没有办法做到这一点?谢谢你的帮助。

ruby-on-rails autoload rails-engines

4
推荐指数
1
解决办法
3264
查看次数

创建新 Rails 引擎时的 gemspec 错误

我正在尝试使用以下链接创建 rails 引擎:http : //guides.rubyonrails.org/engines.html

我收到以下错误

您有一个或多个无效的 gemspec 需要修复。/home/shariq/Documents/plugin/blorgh/blorgh.gemspec 中的 gemspec 无效。请修复此 gemspec。

验证错误是 '"FIXME" or "TODO" is not a description'

我已经尝试过捆绑更新和捆绑安装

这是我的全部工作

日志
shariq@SDEV-MACHINE:~/Documents/plugin$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
shariq@SDEV-MACHINE:~/Documents/plugin$ rails -v
Rails 5.0.0.1
shariq@SDEV-MACHINE:~/Documents/plugin$ mysql --version
mysql  Ver 14.14 Distrib 5.7.15, for Linux (x86_64) using  EditLine wrapper
shariq@SDEV-MACHINE:~/Documents/plugin$ rails plugin new blorgh --mountable -d mysql
      create  
      create  README.md
      create  Rakefile
      create  blorgh.gemspec
      create  MIT-LICENSE
      create  .gitignore
      create  Gemfile
      create  app
      create  app/controllers/blorgh/application_controller.rb
      create  app/helpers/blorgh/application_helper.rb …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails ruby-on-rails-plugins rails-engines

4
推荐指数
1
解决办法
3755
查看次数