我已经基于本教程创建了一个gem /引擎:
http://www.themodestrubyist.com/2010/03/05/rails-3-plugins---part-2---writing-an-engine/
但是,在尝试在新创建的应用程序中使用gem时出现错误.我试图访问应用程序时得到"路由错误 - 未定义的方法`sub'为nil:NilClass".
我在日志文件中唯一能看到的是同样的错误.没有堆栈跟踪/调试跟踪,因此很难确定错误的来源.理想情况下,我希望看到"来自gem的堆栈跟踪",但看起来rails不会调试源自应用程序外部的错误?
我正在使用rvm,ruby 1.9.2,rails 3.0.1.
这是来自gem的我的config/routes.rb文件,虽然我不认为这是一个路由错误,因为调试消息建议..
Rails.application.routes.draw do
resources :pictures, :controller => 'morph/pictures'
end
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我目前正在开发一种可安装的发动机.在发动机内我有以下两种型号:
module Ems
class Channel < ActiveRecord::Base
has_and_belongs_to_many :categories
end
end
module Ems
class Category < ActiveRecord::Base
has_and_belongs_to_many :channels
end
end
Run Code Online (Sandbox Code Playgroud)
这些是db迁移文件:
class CreateEmsChannels < ActiveRecord::Migration
def change
create_table :ems_channels do |t|
t.string :slug
t.string :name
t.timestamps
end
end
end
class CreateEmsCategories < ActiveRecord::Migration
def change
create_table :ems_categories do |t|
t.string :slug
t.string :name
t.text :strapline
t.timestamps
end
end
end
class CreateEmsCategoriesChannels < ActiveRecord::Migration
def up
# Create the association table
create_table :ems_categories_channels, :id => false do |t|
t.integer :category_id, …Run Code Online (Sandbox Code Playgroud) 我们如何将现有的rails app(3.2.11)转换为引擎.我们在rails应用程序中有一些已定义的功能,我们希望将此rails应用程序功能用作引擎,以便我们可以使用其他rails应用程序添加/共享/安装此功能.
我们有任何可用的宝石或任何想法.
提前致谢!!
我有一个工作轨道应用程序.我想添加一个博客.我的要求是:
http://www.mydomain/blog你知道什么适合这些需求吗?该网站的博客部分旨在由公司内部使用.使用它的人是非技术性的,但他们可以应对降价或一些非直观的功能.
我试过了:
有一个用于重命名现有Rails应用程序的插件 - https://github.com/get/Rename
但有没有一些解决方案可以轻松完全重命名现有的Rails引擎?
我正在转换一个应用程序以使用Rails引擎。我的engines/web文件夹中有一个引擎。在config/routes.rb我这样安装它:
mount Web::Engine => '/', as: 'web_engine'
文件夹结构如下:
config
routes.rb
engines
web
config
routes.rb
app
controllers
web
application_controller.rb
...
lib
...
Run Code Online (Sandbox Code Playgroud)
引擎的定义如下:
module Web
class Engine < Rails::Engine
isolate_namespace Web
end
end
Run Code Online (Sandbox Code Playgroud)
我在Web引擎内部的应用程序控制器的定义如下:
module Web
class ApplicationController < ::ActionController::Base
layout 'web/layouts/application'
# other code
end
end
Run Code Online (Sandbox Code Playgroud)
问题在于Web::ApplicationController我内部必须将路由称为web_engine.my_route_path而不是my_route_path。是否可以web_engine从Web引擎内部访问不带前缀的路由?
我已经创建了一个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"
Run Code Online (Sandbox Code Playgroud)
我在/spec/factories.rb中定义了我的工厂:
factory :user do
...
end
Run Code Online (Sandbox Code Playgroud)
要将factories.rb添加到factory girl中的定义路径,我将以下内容添加到我的/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
Run Code Online (Sandbox Code Playgroud)
在我的rails应用程序中,我通过将以下内容添加到Gemfile来包含引擎:
gem 'engine_name', git: "<GIT_LOCATION>"
Run Code Online (Sandbox Code Playgroud)
我还将factory_girl_rails添加到应用程序中(有没有一种方法可以从引擎中公开它?而不是必须在应用程序Gemfile中指定它?).
并且在spec_helper.rb中要求工厂女孩栏:
require 'factory_girl_rails'
Run Code Online (Sandbox Code Playgroud)
现在,当我写下一个控制器测试时,如下所示:
it "saves the user to the database" do
expect{post :create, user: attributes_for(:user)}.to change{User.count}.by(1)
end
Run Code Online (Sandbox Code Playgroud)
我收到错误:"工厂未注册:用户"
我通过打开ruby控制台并运行来仔细检查工厂女孩定义文件路径FactoryGirl.definition_file_paths,我可以在输出中看到来自引擎的factories.rb: …
我们SomeMailer在引擎内部设置了.生成邮件程序后,Rails会创建一个SomeMailerPreview类,并带有注释:
# Preview this email at http://localhost:3000/rails/mailers/some_mailer/test
Run Code Online (Sandbox Code Playgroud)
但是,一旦我Dummy在我的引擎中运行应用程序,该URL就无法解析.
引擎安装在根路径'/'上:
mount MyEngine::Engine => "/"
Run Code Online (Sandbox Code Playgroud)
我已尝试过将url与引擎名称的不同组合,但无法解决.
是否可以在引擎内使用预览功能?
我正在构建一个Rails引擎来处理跨多个应用程序的所有身份验证和授权.所有这些应用程序都使用Devise atm进行身份验证.我想将它移动到一个引擎中,然后可以将其安装在所有这些应用程序中,以便它们自动具有所有设计功能.
我按照设计维基上的"引擎中的设计"指南中的所有步骤进行操作.我遇到的问题是我不能在主应用程序的控制器中使用' current_user '和' new_user_session_path '之类的函数.
我在主应用程序中遇到的错误是:
Showing .../main_app/app/views/shared/_header.haml where line #19 raised:
undefined local variable or method `new_user_session_path' for #<#<Class:0x007f1578968040>:0x007f157897b348>
= link_to t('user.login'), new_user_session_path
Run Code Online (Sandbox Code Playgroud)
引擎没有isolate_namespace.我将Devise添加为engine.gemspec文件中的依赖项,并从主应用程序中的Gemfile中删除了Devise.引擎安装在主应用程序中:
mount Engine::Engine, at: 'idms'
Run Code Online (Sandbox Code Playgroud)
在发动机的路线中,我将设计配置为:
devise_for :users, {
class_name: "IdmsGem::User",
module: :devise
controllers: { sessions: "devise/sessions" }
}
Run Code Online (Sandbox Code Playgroud)
initializers/devise.rb文件如下:
require 'devise/orm/active_record'
Devise.setup do |config|
config.router_name = '/idms_gem'
end
Run Code Online (Sandbox Code Playgroud)
引擎中的用户模型:
module Engine
class User < ActiveRecord::Base
devise :database_authenticatable
self.table_name = "users"
end
end
Run Code Online (Sandbox Code Playgroud)
我在Ruby 2.2.2上使用Rails 4.2.1和Devise 3.5.1.
我的问题是,如何让我的主应用程序中的控制器和视图从我的引擎中配置的设备访问功能?
欢迎任何帮助!我现在一直在谷歌搜索和尝试过去几天的所有事情.感谢大家!
编辑: …
所以这是我的问题.我有一个主要应用程序,它正在设计,我正在创建一个引擎.在引擎中我需要来自主应用程序的current_user.不知道我将如何得到它,我尝试了这个链接但无济于事.任何帮助都会很棒.如果不建议这样做,请解释原因.
rails-engines ×10
ruby ×3
devise ×2
actionmailer ×1
blogs ×1
debugging ×1
factory-bot ×1
gem ×1