我正在创建我的第一个Rails 3引擎,我目前收到以下错误消息
is a Railtie/Engine and cannot be installed as plugin (RuntimeError)
Run Code Online (Sandbox Code Playgroud)
为了给你更多的背景,我没有将引擎作为gem,但我将引擎文件放在vendor/plugins文件夹中.我知道在插件文件夹中加载时存在问题,但我不清楚如何解决问题.
我在Engine中的rails/init.rb文件具有以下代码
require 'rails'
module RailsApp
module MyEngine
class Engine < Rails::Engine
config.after_initialize do
RailsApp::GameType.register do |game_type|
game_type.name = "TreasureIsland"
game_type.version = "0.1"
game_type.thumbnail = "teasure_island.jpg"
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
建议?
在Rails :: Plugin(对于Rails 3)的文档中,我正在阅读以下内容:
" ......你居然不能宣布一个Rails :: Engine上的插件内,否则会引起相同的文件被加载两次.这意味着,如果你想出货的发动机,宝石不能用作插件和副反之亦然".
任何人都可以更确切地了解哪些文件被加载两次?我宣布一个插件/宝石作为引擎,并能正常工作也正在把供应商/插件里面(我想保持这种方式),尽管在上面的语句.我只是想清楚一下为什么(以及是否)这不是一件好事.
谢谢!
我正在努力将我的一个应用程序的一些功能提取到引擎中.似乎会生成应用中的路由,然后生成引擎的路由.最终的结果是我的引擎路线被认为是低优先级,我的应用程序路线在它们到达引擎路线之前正在吃掉所有请求.我有办法控制发动机路线的优先级吗?
我有一个Rails应用程序,我正在尝试将Rails引擎集成到.
主机应用程序有一些捕获所有路线:
# magic urls
match '/' => 'admin/rendering#show'
match '*path/edit' => 'admin/rendering#show', :defaults => { :editing => true }
match '*path' => 'admin/rendering#show'
Run Code Online (Sandbox Code Playgroud)
看起来应用程序捕获所有路由后加载引擎路由.
/sitemap.xml(.:format) {:format=>"xml", :controller=>"admin/sitemaps", :action=>"show"}
/(.:format) {:controller=>"admin/rendering", :action=>"show"}
/*path/edit(.:format) {:controller=>"admin/rendering", :action=>"show"}
/*path {:controller=>"admin/rendering", :action=>"show"}
engine_envs GET /engine/envs/:id(.:format) {:controller=>"engine/envs", :action=>"show"}
PUT /engine/envs/:id(.:format) {:controller=>"engine/envs", :action=>"update"}
jammit /assets/:package.:extension(.:format) {:extension=>/.+/, :controller=>"jammit", :action=>"package"}
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都在击中/engine/envs路线被应用程序捕获所有路线.但是我发现堵塞路线是在发动机后加载的,我不相信那些被抓住了.有没有办法覆盖应用程序路线?
routes ruby-on-rails ruby-on-rails-plugins rails-engines ruby-on-rails-3
没有很多具体的代码,这只是模糊的,但我会尽我所能.
给定一个rails引擎,一个基本引擎而不是自己空间中的可安装引擎,如何将应用程序中的方法作为应用程序控制器的before_filter提供给应用程序?
我一直在查看Devise代码,因为我想要的是与我对Devise的经历相似,但我承认我并不理解我所经历的很多内容.
我可以这样做,如果我把include Myengine::Mymodule应用程序控制器放在我想要的方法可用于过滤,但我希望可以只使用方法而不必包括模块.
这是尝试将rails应用程序转换为多个rails应用程序使用的引擎的最新障碍,并且对获取正确命名空间,模块配置等的任何指导表示赞赏.
我的应用程序中有一个Rails引擎.这是它挂钩到我的routes.rb文件:
Mercury::Engine.routes
Run Code Online (Sandbox Code Playgroud)
我试图限制访问引擎提供的URL,所以我尝试使用约束:
class EditorRestrictor
def self.matches?(request)
false
end
end
constraints EditorRestrictor do
Mercury::Engine.routes
end
Run Code Online (Sandbox Code Playgroud)
但引擎的路线仍然可以访问.我重新启动了我的应用以防万一,但没关系.有任何想法吗?
我正在编写一个可安装的Rails 3引擎,我将我的引擎路由与主机应用程序相结合.但是,主机应用程序的路由优先于我的引擎路由.有没有办法可以覆盖主机应用程序的路由(特别是根路由)?
这是我的引擎的路线my_enging/config/routes.rb:
MyEngine::Engine.routes.draw do
root :to => "home#index"
end
# Mount engine routes to host application
Rails.application.routes.draw do
mount MyEngine::Engine, :at => "/"
end
Run Code Online (Sandbox Code Playgroud)
这是结果rake routes,主持人的根位于顶部:
root / welcome#index
my_engine / MyEngine::Engine
root / home#index
Run Code Online (Sandbox Code Playgroud)
Spree是这样做的一个宝石,但我无法找到他们如何实现这一点.
我正在尝试创建一个rails引擎,它将使用我添加到引擎的gem依赖项中的javascript.但是当我在我的application.js中为我的引擎添加以下行时,我一直得到"找不到文件'fullcalendar'":
//= require fullcalendar
Run Code Online (Sandbox Code Playgroud)
这一行正在将javascript从gem依赖项加载到rails引擎中.
当gem安装在普通的rails应用程序(不是引擎)上时,这条线也可以工作.我在这里错过了什么?引擎可以从另一个引擎/ gem加载javascript吗?
更新: 研究我自己的问题可能是链轮只在引擎内查找javascript.gem依赖项安装在父应用程序的供应商/缓存中而不是引擎因此//要求fullcalendar失败,因为它在引擎内查找并且fullcalendar的javascript在父应用程序中.
令我困惑的是,如果我明确地在父应用程序gemfile中包含fullcalendar,那么我可以在引擎中访问它.这对我来说没有意义.在这两种情况下,完整的日历宝石javascript都在父应用程序中,但行为是不同的.在两个地方包括宝石对我来说是不合适的,似乎不是一个合适的解决方案.有什么想法吗?
ruby-on-rails rails-engines ruby-on-rails-3 asset-pipeline ruby-on-rails-3.2
我正在研究Rails引擎.该引擎在其public文件夹中包含一些静态JS/CSS ,我希望这些资产可以合并到宿主应用程序中并由其提供服务.
我把它添加到我的engine.rb文件中:
initializer "static assets" do |app|
app.middleware.insert_before(::ActionDispatch::Static, ::ActionDispatch::Static, "#{root}/public")
end
Run Code Online (Sandbox Code Playgroud)
有趣的是,当我在Rails引擎中运行虚拟应用程序时,或者通过path以下方式将引擎安装在我的文件系统上的单独应用程序中:
gem 'my-engine', path: '~/my-engine`
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,一旦我发布到RubyGems并通过其他应用程序安装
gem 'my-engine'
Run Code Online (Sandbox Code Playgroud)
静态资产全部404.
关于如何诊断的任何想法?在主机应用程序中还有什么我需要做的,以确保静态资产被拉入+服务吗?它不是生产环境的东西,因为它甚至不能用于开发.
我做了一个超级简单的Rails应用程序,并且使用字体很棒,没有问题。将其扩展为在Rails引擎中执行相同的步骤会产生以下错误。
File to import not found or unreadable: font-awesome
Run Code Online (Sandbox Code Playgroud)
我找不到解决方案。如果有人对如何使这种简单的Rails引擎与Font-awesome兼容,我将不胜感激。
用一个模型类创建基本引擎以进行测试
rails plugin new testeng --full --mountable
cd testeng
bundle install
rails g scaffold book title:string desc:string
rake db:migrate
Run Code Online (Sandbox Code Playgroud)
添加字体真棒
编辑testeng.gemspec并在包含rails gem之后添加sass-rails和font-awesome gem
s.add_dependency 'sass-rails', '~> 4.0.3'
s.add_dependency 'font-awesome-rails'
Run Code Online (Sandbox Code Playgroud)
将application.css重命名为application.css.scss
cd app/assets/stylesheets/testeng/
mv application.css application.css.scss
Run Code Online (Sandbox Code Playgroud)
编辑app / assets / stylesheets / testeng / application.css.scss并在文件末尾附加导入语句。
@import 'font-awesome';
Run Code Online (Sandbox Code Playgroud)
编辑app / views / testeng / books / index.html.erb并使用一些字体超赞的图标
<h1>Listing books</h1>
<%= link_to content_tag(:i, '', :class => "fa fa-plus-circle"), new_book_path %>
Run Code Online (Sandbox Code Playgroud)
启动Rails服务器
cd …Run Code Online (Sandbox Code Playgroud) rails-engines ×10
ruby-on-rails ×10
plugins ×2
ruby ×2
font-awesome ×1
module ×1
routes ×1
routing ×1
rubygems ×1