标签: rails-engines

创建Rails 3引擎的问题

我正在创建我的第一个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)

建议?

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

5
推荐指数
1
解决办法
1648
查看次数

Rails 3中的插件与引擎,作为宝石出货

在Rails :: Plugin(对于Rails 3)的文档中,我正在阅读以下内容:

" ......你居然不能宣布一个Rails :: Engine上的插件内,否则会引起相同的文件被加载两次.这意味着,如果你想出货的发动机,宝石不能用作插件和副反之亦然".

任何人都可以更确切地了解哪些文件被加载两次?我宣布一个插件/宝石作为引擎,并能正常工作也正在把供应商/插件里面(我想保持这种方式),尽管在上面的语句.我只是想清楚一下为什么(以及是否)这不是一件好事.

谢谢!

plugins rubygems ruby-on-rails rails-engines

5
推荐指数
1
解决办法
1680
查看次数

Rails 3引擎:如何更改路由的优先级

我正在努力将我的一个应用程序的一些功能提取到引擎中.似乎会生成应用中的路由,然后生成引擎的路由.最终的结果是我的引擎路线被认为是低优先级,我的应用程序路线在它们到达引擎路线之前正在吃掉所有请求.我有办法控制发动机路线的优先级吗?

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

5
推荐指数
1
解决办法
1545
查看次数

如何从引擎覆盖Rails应用程序路由?

我有一个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

5
推荐指数
1
解决办法
2636
查看次数

一种从引擎到应用程序添加before_filter的方法

没有很多具体的代码,这只是模糊的,但我会尽我所能.

给定一个rails引擎,一个基本引擎而不是自己空间中的可安装引擎,如何将应用程序中的方法作为应用程序控制器的before_filter提供给应用程序?

我一直在查看Devise代码,因为我想要的是与我对Devise的经历相似,但我承认我并不理解我所经历的很多内容.

我可以这样做,如果我把include Myengine::Mymodule应用程序控制器放在我想要的方法可用于过滤,但我希望可以只使用方法而不必包括模块.

这是尝试将rails应用程序转换为多个rails应用程序使用的引擎的最新障碍,并且对获取正确命名空间,模块配置等的任何指导表示赞赏.

plugins module ruby-on-rails rails-engines ruby-on-rails-3

5
推荐指数
1
解决办法
1353
查看次数

限制对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)

但引擎的路线仍然可以访问.我重新启动了我的应用以防万一,但没关系.有任何想法吗?

ruby routing ruby-on-rails rails-engines

5
推荐指数
1
解决办法
643
查看次数

从Mountable Engine覆盖主机应用程序的根路由

我正在编写一个可安装的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是这样做的一个宝石,但我无法找到他们如何实现这一点.

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

5
推荐指数
1
解决办法
1444
查看次数

在Rails引擎中使用另一个gem的javascript

我正在尝试创建一个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

5
推荐指数
1
解决办法
1188
查看次数

Rails引擎的静态资产未在主机应用程序中提供

我正在研究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.

关于如何诊断的任何想法?在主机应用程序中还有什么我需要做的,以确保静态资产被拉入+服务吗?它不是生产环境的东西,因为它甚至不能用于开发.

ruby-on-rails rails-engines

5
推荐指数
1
解决办法
613
查看次数

Rails Engine-找不到导入文件或不可读:font-awesome

我做了一个超级简单的Rails应用程序,并且使用字体很棒,没有问题。将其扩展为在Rails引擎中执行相同的步骤会产生以下错误。

File to import not found or unreadable: font-awesome
Run Code Online (Sandbox Code Playgroud)

我找不到解决方案。如果有人对如何使这种简单的Rails引擎与Font-awesome兼容,我将不胜感激。

生成Rails引擎和设置字体真棒的步骤...

用一个模型类创建基本引擎以进行测试

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)

ruby-on-rails rails-engines font-awesome

5
推荐指数
1
解决办法
4038
查看次数