标签: rails-engines

自定义Gem in/vendor/gems not Loading

我最近决定在我的几个Rails应用程序中使用一些功能并将其提取到引擎中.我现在已经完成了引擎,我正在尝试将完成的gem安装到我的一个应用程序中.

这个特殊的gem不是我想要公开的东西,所以我打包了gem,gem build my_gem.gemspec然后将打包的gem放在我的应用程序的vendor/gems文件夹中.然后,我添加gem 'my_gem', '0.0.1', :path => 'vendor/gems'到我的gemfile并运行bundle install.

不幸的是,Rails似乎没有加载gem,我似乎无法手动要求它:

$ bundle exec rails console --sandbox
Loading development environment in sandbox (Rails 3.2.11)
Any modifications you make will be rolled back on exit
irb(main):001:0> MyGem
NameError: uninitialized constant MyGem
        from (irb):1
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.11/lib/rails/commands/console.rb:47:in `start'
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.11/lib/rails/commands/console.rb:8:in `start'
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.11/lib/rails/commands.rb:41:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
irb(main):002:0> require 'my_gem'
LoadError: cannot load such file -- my_gem
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport-3.2.11/lib/active_support/dependencies.rb:251:in `require'
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport-3.2.11/lib/active_support/dependencies.rb:251:in `block …
Run Code Online (Sandbox Code Playgroud)

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

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

为已安装的 Rails 引擎设置 default_url_options

使用 Rails 3.2.13 和 spree 2.0.2
我遇到了与动态范围下的 Rails 可安装引擎类似的问题

我的路线:

scope ':locale', locale: /en|jp/ do
  mount Spree::Core::Engine, at: '/store'
  root to: 'home#index'
end
Run Code Online (Sandbox Code Playgroud)

我想输出链接以更改区域设置:

<%= link_to 'JP', url_for(locale: :jp) %>
Run Code Online (Sandbox Code Playgroud)

但这输出:

<a href="/en/store/?locale=jp">JP</a>
Run Code Online (Sandbox Code Playgroud)

而不是预期的:

<a href="/jp/store">JP</a>
Run Code Online (Sandbox Code Playgroud)

- 编辑 -

当我输入ApplicationController

def default_url_options(options={})
  { locale: I18n.locale }
end
Run Code Online (Sandbox Code Playgroud)

它在存储中设置区域设置参数两次,而不是合并它们:

http://localhost:3000/en/store/products/bag?locale=en
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails spree rails-engines

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

是否可以在装饰器中覆盖 Rails 引擎模型关联?

我正在使用 Rails 引擎,它定义了一个具有以下关系的类:

module Blogit
  class Post < ActiveRecord::Base

    ...

    belongs_to :blogger, :polymorphic => true
    ...

end
Run Code Online (Sandbox Code Playgroud)

我正在尝试在装饰器文件中覆盖此关联。也就是说,如果可能的话,我不希望这种关联存在。

在我的装饰器文件中,我使用 class_eval 来扩展类定义。

Blogit::Post.class_eval do
  ...
end
Run Code Online (Sandbox Code Playgroud)

但我似乎无法覆盖或破坏这种关系。有人知道怎么做吗?

ruby-on-rails rails-engines ruby-on-rails-3.2

5
推荐指数
0
解决办法
259
查看次数

App::Application.load_tasks 在哪里定义?

# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require File.expand_path('../config/application', __FILE__)

Dummy::Application.load_tasks
Run Code Online (Sandbox Code Playgroud)

鉴于上述情况,在制作引擎时,这个虚拟应用程序也会加载位于 /lib/tasks 中的引擎任务。它是如何做到这一点的?我似乎无法找到 load_tasks 的定义位置或它是如何工作的..

任何建议都会很棒。

ruby ruby-on-rails rails-engines

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

将 Rails 引擎的 url_helpers 与 Rspec 中的基本应用程序结合起来

我有一个 Rails 3.2.15 应用程序,其引擎安装在顶部,如下所示routes.rb

mount Service::Engine => '/'
Run Code Online (Sandbox Code Playgroud)

在测试我的应用程序时,我想为我的引擎使用路由 url_helpers,如果该路由不存在,则回退到主应用程序。

例如,我在主应用程序(rake routes输出)中有这条路线,但引擎中不存在:

manager_account  GET  /manager/accounts/:id(.:format)     manager_accounts#show
Run Code Online (Sandbox Code Playgroud)

我将应用程序和引擎的 url_helpers 包含在spec_helper.rb

RSpec.configure do |config|
  config.include Service::Engine.routes.url_helpers, type: :feature
  config.include Rails.application.routes.url_helpers, type: :feature
end
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我尝试调用manager_account_path(account)我的规范时,出现以下错误:

ActionController::RoutingError:
   No route matches {:action=>"show", :controller=>"manager_accounts", :id=>...
Run Code Online (Sandbox Code Playgroud)

如果我这样称呼它,main_app.manager_account_path(account)那么它会成功,但我真的很想避免每次都指定它。有什么方法可以设置这个,我可以使用我的 url_helpers ,这样如果引擎中不存在路由,它将回退到基本应用程序?

rspec ruby-on-rails rails-engines

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

Rails 引擎中的 Gem 依赖项

我遵循了Rails 文档中的引擎入门,apiengines目录中设置了一个引擎。根据第6.6 节其他 Gem 依赖项,应该在engines/my_api/my_api.gemspec文件中定义 gem 依赖项,这几乎就是我所做的:

s.add_dependency "responders", "2.0"
Run Code Online (Sandbox Code Playgroud)

添加后

`gem 'my_api', path: "engines/my_api"`
Run Code Online (Sandbox Code Playgroud)

到应用程序Gemfile和运行捆绑器,一切看起来都符合预期:

 bundle install | grep responders
 Installing responders 2.0.0
Run Code Online (Sandbox Code Playgroud)

在下一步中,我使用相应的控制器等设置根路径,engines/my_api/app/controllers/my_api/application_controller.rb然后添加以下内容:

module MyApi
  class ApplicationController < ActionController::Base
    respond_to :json
  end
end
Run Code Online (Sandbox Code Playgroud)

我启动 Rails 服务器,转到根 url 并猜猜是什么?我收到以下消息:

控制器级别的 respond_to' 功能已被提取到响应者 gem 中。将它添加到您的 Gemfile 以继续使用此功能: gem 'responders', '~> 2.0' 有关详细信息,请参阅 Rails 升级指南。

正如错误消息中所建议的,我已将 gem 添加到应用程序中Gemfile,运行bundle install,一切都按预期工作。

据我了解,引擎应该是自包含的 Rails 应用程序。从一个自包含的应用程序中,我至少希望正确解决它的依赖关系。我认为我只是做错了什么,我希望有人能够帮助我解决这个问题,为什么我必须在应用程序中明确指定 gem …

ruby gem ruby-on-rails rails-engines

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

RSpec 功能规范找不到 Rails 引擎的路由

我正在使用rails v5.1.0和开发Rails 引擎rspec-rails 3.5.2

我有一个简单的功能规范:

require "rails_helper"

module MyEngineName
  RSpec.feature "Some Feature", type: :feature do
    it "user can navigate to page and blah blah", :js do
      visit edit_job_path(1)
      # .... other stuff
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这引发了错误

undefined method `edit_job_path' for #<RSpec::ExampleGroups::SomeFeature:0x007fc098a570e8>
Run Code Online (Sandbox Code Playgroud)

因为edit_job_path找不到路由助手。

为了让我的功能规范能够访问我的引擎路线,我需要做什么特别的事情吗?

RSpec 文档提到您可以指定引擎 routes,但这似乎仅适用于路由规范。当我将它添加到功能规格时,它失败了undefined method 'routes'

谢谢!

编辑:由于请求了我的路由文件,因此将其添加到此处。很短——

# config/routes.rb
MyEngineName::Engine.routes.draw do
  root to: redirect("/my_engine_name/jobs")
  resources :jobs
end
Run Code Online (Sandbox Code Playgroud)

来自 rake 的所有路由列表

> rake app:routes
   ....
   ....

Routes for …
Run Code Online (Sandbox Code Playgroud)

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

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

从Engine类访问url_helper

我尝试从Module类中访问URL帮助程序.这是我的代码:

module Station
  class Plugins

    @@plugins = [] unless defined?(@@plugins) && @@plugins.class == Array

    class << self

      def all
        return @@plugins.sort_by { |p| p[:weight] }
      end

      def register(plugin = {})
        raise "plugin must be a Hash (ie.: `register(:foo => 'bar')`)" unless plugin.class == Hash
        raise "plugin must contain :name (ie.: `register(:name => 'my_plugin')`)" unless plugin[:name].present?
        plugin[:weight] = 1 unless plugin[:weight].present?
        plugin[:href] = eval("#{plugin[:name].downcase.pluralize}_url") unless plugin[:href].present?

        @@plugins.push(plugin) unless @@plugins.include?(plugin)
      end
    end
    # include default plugins: 
    Station::Plugins.register(:name => "Pages", :weight => -1) …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails class urlhelper rails-engines

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

构建Rails 3引擎抛出Gem :: Package :: TooLongFileName错误

我正在尝试使用我的引擎,gem build myengine但我不断收到以下错误:

ERROR:  While executing gem ... (Gem::Package::TooLongFileName)
    Gem::Package::TooLongFileName
Run Code Online (Sandbox Code Playgroud)

我不希望myengine这个名字太长.知道这里可能会发生什么吗?

gem rails-engines ruby-on-rails-3.2

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

如何翻译Rails引擎的模型和属性名称?

翻译Rails项目的模型和属性名称的常用方法是:

MyModel.model_name.human

MyModel.human_attribute_name :myattribute
Run Code Online (Sandbox Code Playgroud)

或者,当您使用MyModel的表单时:

form.label :myattribute
Run Code Online (Sandbox Code Playgroud)

语言环境文件config/locales/en.yml如下所示:

en:
  activerecord:
    models:
      mymodel:
        one: TranslatedMyModel
        other: TranslatedMyModels
  attributes:
    mymodel:
      myattribute: translated attribute
Run Code Online (Sandbox Code Playgroud)

这适用于常规的Rails项目.当相同的模型成为引擎调用的一部分时MyEngine,同样的内容将放入config/locales/en.yml引擎并以my_engine为前缀:

en:
  my_engine:
      activerecord:
        models:
          mymodel:
            one: TranslatedMyModel
            other: TranslatedMyModels
      attributes:
        mymodel:
          myattribute: translated attribute
Run Code Online (Sandbox Code Playgroud)

my_engine前缀适用于各种翻译,除非尝试通过上述方法获取模型或属性名称.

我已经设置了一个新的Rails项目和引擎与Rails 3.2.11来测试,但没有成功.

有人知道如何使这项工作?

attributes model ruby-on-rails internationalization rails-engines

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