有人可以帮我理解Rails引擎和可安装应用程序之间的差异吗?在Rails 3.1中,您可以使用"rails new plugin _ __ "命令创建任一个.
rails plugin new forum --full # Engine
rails plugin new forum --mountable # Mountable App
Run Code Online (Sandbox Code Playgroud)
你什么时候想要使用一个?我知道你可以将Engine打包成一个宝石.可安装应用程序的情况不是这样吗?还有什么其他差异?
ruby-on-rails-plugins rails-engines ruby-on-rails-3 ruby-on-rails-3.1
我正在为rails 3应用程序创建一个新引擎.您可以猜到,此引擎位于我的应用程序的lib目录中.
但是,我在开发它时遇到了一些问题.实际上,每次我更改引擎中的内容时,我都需要重新启动服务器.
有办法避免这种情况吗?
我可以强制rails完全重新加载lib目录或特定文件以及他对每个请求的要求吗?
谢谢你的帮助 :)
我在这里做引擎,它可以独立工作.
当我将它转换为gem并将其加载到另一个应用程序中时,我得到了许多未定义的错误,来自我的引擎gem的依赖.
这是gemspec:
s.add_dependency('paperclip')
s.add_dependency('jquery-rails')
s.add_dependency('rails3-jquery-autocomplete')
s.add_dependency('remotipart')
s.add_dependency('cancan')
Run Code Online (Sandbox Code Playgroud)
在应用程序中,当我进行bundle安装时,它列出了所有这些依赖项,但是当我运行应用程序时,我收到了很多未定义的方法错误(例如来自paperclip的has_attachment).似乎应用程序不加载引擎依赖项.这是默认行为吗?我可以改变吗?引擎内部的插件也发生了同样的事情.
如果我手动插入那些宝石,在应用程序Gemfile中,所有工作......
我有多个rails应用程序与同一个后端交谈,我希望他们分享一些迁移.
我设置了一个rails引擎(带有enginex),我可以共享任何东西(控制器,视图,模型......)但没有迁移.我做不到!
我尝试创建一个文件db/migrate/my_migration.rb,但在我的主应用程序中,如果我这样做:
rake db:migrate
Run Code Online (Sandbox Code Playgroud)
它不加载它们.
经过一番Google上搜寻它似乎有一些最近的工作在这,似乎这已经合并轨主.我用rails 3.0.3你有没有办法让这个工作?
谢谢 !
我开始制作Rails 3.1引擎,我很难用rspec测试它.
首先,如果我运行rails g integration_test whatever它会在测试/集成中创建一个常规的集成测试而不是spec/requests(rspec-rails gem被安装并作为gemspec文件中的开发依赖项而需要)
此外,当我运行规范测试时,我得到一个错误,说明与我正在测试的模型相对应的表尚未创建.我尝试rake engine_name:install:migrations并rake db:migrate从虚拟应用程序内部运行,我得到一个"表已存在"错误.
一切似乎都断开了,我觉得我在这里遗漏了一些东西,使rspec gem无缝地工作,就像通常使用完整的rails应用程序一样.
我从http://rubyx.com/2011/03/01/start-your-engines跟踪了所有更改,我可以通过控制台启动虚拟应用程序手动测试引擎,如http:// railscasts所示. com/episodes/277-mountable-engines.
有没有办法让rspec成为测试rails 3.1引擎的默认设置?
rspec ruby-on-rails rails-engines rspec-rails ruby-on-rails-3.1
我正在制作一个小型轨道引擎,我这样安装:
mount BasicApp::Engine => "/app"
Run Code Online (Sandbox Code Playgroud)
使用这个答案,我已经验证了引擎中的所有路由都应该是:
但是 - 当我(在引擎内)链接到命名路由(在引擎内定义)时,我收到此错误
undefined local variable or method `new_post_path' for #<#<Class:0x000000065e0c08>:0x000000065d71d0>
Run Code Online (Sandbox Code Playgroud)
运行"rake route"清楚地验证"new_post"应该是一个命名路径,所以我不知道为什么Rails(3.1.0)无法解决它.欢迎任何帮助
我的config/route.rb(对于引擎)看起来像这样
BasicApp::Engine.routes.draw do
resources :posts, :path => '' do
resources :post_comments
resources :post_images
end
end
Run Code Online (Sandbox Code Playgroud)
我应该补充说它是和孤立的引擎.但是,像main_app.root_path这样的路径工作正常 - 而root_path却没有
mount ruby-on-rails named-routing rails-engines ruby-on-rails-3
我正在创建一个由核心和几个模块组成的应用程序.这些模块是rails引擎,并提供实际功能,因为核心本身仅充当主机.引擎托管/lib在各自的路径上并安装在它们各自的路径上.
coreApp
???lib
??? module1
??? module2
??? etc
Run Code Online (Sandbox Code Playgroud)
然后像这样安装模块
mount Module1::Engine => "/module1", :as => "module1"
mount Module2::Engine => "/module2", :as => "module2"
Run Code Online (Sandbox Code Playgroud)
虽然登录本身是由模块完成的,但核心也负责处理会话.
我还没有找到一种与引擎共享核心应用程序布局的好方法.截至目前,这就是我如何使布局可用于引擎:
coreApp
??? app
??? views
??? layouts
??? application.html.erb
??? core.html.erb
Run Code Online (Sandbox Code Playgroud)
该文件core.html.erb仅包含
<%= render :template => 'layouts/application' %>
Run Code Online (Sandbox Code Playgroud)
然后是这样包含在每个模块中
module Module1
class ApplicationController < ActionController::Base
layout "core"
end
end
Run Code Online (Sandbox Code Playgroud)
虽然它不是特别优雅,但它工作正常,并且模块的内容呈现在yield应用程序布局中的语句所在的位置.
问题如下:
我需要一种方法来包含活动模块的样式表.
标题包含有关登录用户的信息,例如
Logged in as <%= @user[:realname] %>
Run Code Online (Sandbox Code Playgroud)
这来自核心 home_controller
def index
@user …Run Code Online (Sandbox Code Playgroud) 我读了一些关于这些论点的文件,但我不清楚它们是什么,它们之间有什么区别,如果其中一个符合我的需要.
我需要编写一个可插入其他应用程序的应用程序,并希望将其作为gem包含在其他应用程序中.基本上我需要一些模型,一个控制器和没有视图,加上一些初始化,支持来自托管应用程序和生成器的配置参数.
我是正确的吗?
我应该阅读什么才能理解如何做到这一点?
更新:
有很多细节AF一个很不错的文章,可以发现在这里.
实质上:
Railtie是Rails框架的核心,它提供了几个钩子来扩展Rails和/或修改初始化过程.
Rails :: Engine只不过是一个已经设置了一些初始化程序的Railtie.由于Rails :: Application和Rails :: Plugin是引擎,因此这里描述的相同配置可以在所有三个中使用.
我发现了一些文章解决了引擎内的助手问题,这些问题不适用于消费(父)应用程序.为了确保我们都在同一页上,让我们说我们有这个:
module MyEngine
module ImportantHelper
def some_important_helper
...do something important...
end
end
end
Run Code Online (Sandbox Code Playgroud)
如果您查看"隔离引擎的助手"(L293)中的rails引擎文档,它会说:
# Sometimes you may want to isolate engine, but use helpers that are defined for it.
# If you want to share just a few specific helpers you can add them to application's
# helpers in ApplicationController:
#
# class ApplicationController < ActionController::Base
# helper MyEngine::SharedEngineHelper
# end
#
# If you want to include all of the engine's helpers, you can use #helpers …Run Code Online (Sandbox Code Playgroud) ruby-on-rails view-helpers helpers rails-engines ruby-on-rails-3.1
我试过这样的方式:
s.add_dependency 'gem', :path => '../gem'
Run Code Online (Sandbox Code Playgroud)
喜欢添加gem gemfile,但它不起作用,并会导致此错误:
/Users/chenqh/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/requirement.rb:81:in `parse': Illformed requirement
Run Code Online (Sandbox Code Playgroud) rails-engines ×10
dependencies ×2
gem ×1
gemspecs ×1
helpers ×1
mount ×1
plugins ×1
railtie ×1
reload ×1
rspec ×1
rspec-rails ×1
view-helpers ×1