我最近决定在我的几个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) 使用 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) 我正在使用 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)
但我似乎无法覆盖或破坏这种关系。有人知道怎么做吗?
# 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 的定义位置或它是如何工作的..
任何建议都会很棒。
我有一个 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 ,这样如果引擎中不存在路由,它将回退到基本应用程序?
我遵循了Rails 文档中的引擎入门,并api在engines目录中设置了一个引擎。根据第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 …
我正在使用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) 我尝试从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) 我正在尝试使用我的引擎,gem build myengine但我不断收到以下错误:
ERROR: While executing gem ... (Gem::Package::TooLongFileName)
Gem::Package::TooLongFileName
Run Code Online (Sandbox Code Playgroud)
我不希望myengine这个名字太长.知道这里可能会发生什么吗?
翻译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
rails-engines ×10
gem ×3
rspec ×2
ruby ×2
attributes ×1
class ×1
model ×1
rspec-rails ×1
spree ×1
urlhelper ×1