我有一个 Rails 引擎,我想在其中使用 Devise。我按照本指南正常安装了设备。
我在我的引擎 devise.rb 中添加了这个:
Devise.setup do |config|
config.router_name = :cms_user
end
Run Code Online (Sandbox Code Playgroud)
我在我的路由文件中添加了这个:
Cms::User::Engine.routes.draw do
devise_for :users, {
class_name: 'Cms::User',
module: :devise
}
end
Run Code Online (Sandbox Code Playgroud)
我在我的路线中添加了这个:
devise_for :users, {
class_name: 'Cms::User',
module: :devise
}
Run Code Online (Sandbox Code Playgroud)
但是我不断收到此错误:
undefined method 'cms_user'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么 ?
ruby-on-rails content-management-system rails-engines devise
我试图通过使用Rails引擎将我的应用程序的模型分离为更可重用.
我创建了一个Common引擎,它包含了我想要在网站和API项目之间共享的应用程序的所有模型.
由于默认情况下Rails引擎命名空间的所有模型的性质,我想知道是否有一种方法可以让它更简单,只是不命名引擎所包含的任何模型.
我希望简化我的模型,而不必重写我的应用程序,为我的所有模型添加命名空间前缀,并将引擎共享为我的其他应用程序的全局模型.
我试过从引擎中删除"isolate_namespace"但我的视图中仍然存在路径问题.例如.
<%= link_to user.name, user %>
Run Code Online (Sandbox Code Playgroud)
在common的命名空间中查找url会产生错误
undefined method common_user_path
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这一目标?
我正在编写一些装饰器来覆盖此处所述的 Rails 引擎。我正在尝试向引擎中的类添加一个简单的方法,这是我的代码:
# app/decorators/models/my_engine/user_decorator.rb
MyEngine::User.class_eval do
def self.find_by_name_or_mis_id str
where("CONCAT(#{table_name}.firstname, ' ', #{table_name}.surname) LIKE CONCAT('%', :s, '%') OR mis_id = :s", { s: str })
end
end
Run Code Online (Sandbox Code Playgroud)
我的应用程序找不到该方法,在 rails 控制台中我尝试对其进行测试:
# rails c
MyEngine::User.find_by_name_or_mis_id "John"
NoMethodError: undefined method `find_by_name_or_mis_id' for #<Class:0x007fcb85a45580>
Run Code Online (Sandbox Code Playgroud)
我可以通过require '/models/my_engine/user_decorator'在控制台上做来让它工作,为什么 rails 不接我的装饰器?
在rails初始化文件中,有一行用于配置接受符号的活动对象:
config.objects += [ :room, :hotel, ..etc ]
Run Code Online (Sandbox Code Playgroud)
这些符号表示我想要配置的类.
我的问题是我使用的是一个rails引擎,它定义了我想要配置的'Blogit :: Post'模块类.如何将其作为符号添加到配置数组中?
所以我一直在阅读Ruby on Rails Engine指南迁移+种子 ,似乎为了在引擎上运行种子,它们需要在使用它的应用程序中添加
(使用虚拟应用程序的示例)
添加MyEngine::Engine.load_seed到Engine/test/dummy/db/seeds.rb
我的问题是为什么我们需要这样做,他们应该与主应用程序隔离?(它们没有关联,只是播种引擎数据库)
注意:如果您正在使用更多上下文,我已将设计gem(/ engine)添加到我的Engine中,种子数据只是在我的Engine上下文中创建用户以登录其界面
我正在开发一个rails引擎,这是我的 gem.gemspec
s.required_ruby_version = '>= 2.0.0'
s.add_dependency 'rails', '>= 4.2.0'
s.add_dependency 'enumerate_it'
s.add_dependency 'slim-rails'
s.add_dependency 'bootstrap-sass'
s.add_dependency 'jquery-rails'
s.add_development_dependency 'rdoc'
s.add_development_dependency 'tomdoc'
s.add_development_dependency 'sqlite3'
s.add_development_dependency 'rspec-rails'
s.add_development_dependency 'timecop'
s.add_development_dependency 'shoulda-matchers'
s.add_development_dependency 'factory_girl_rails'
s.add_development_dependency 'database_cleaner'
s.add_development_dependency 'awesome_print'
s.add_development_dependency 'guard'
s.add_development_dependency 'guard-rspec'
s.add_development_dependency 'guard-migrate'
s.add_development_dependency 'guard-livereload'
s.add_development_dependency 'thor'
s.add_development_dependency 'simplecov'
s.add_development_dependency 'codeclimate-test-reporter'
Run Code Online (Sandbox Code Playgroud)
这是我的迁移文件,当我运行install命令时,它将复制到我的rails应用程序:
class CreateMpaStorySchema < ActiveRecord::Migration
def change
create_table :mpa_story_archetypes do |t|
t.string :name
t.string :api_name
t.string :api_key
t.text :description
t.integer :kind, index: true
t.integer :tier, index: true
t.integer :execution, index: …Run Code Online (Sandbox Code Playgroud) rspec ruby-on-rails foreign-keys rails-migrations rails-engines
我有这个非常基本的问题.我正在使用这个仪表板导轨引擎,这给了我一个views/layouts/dashing/dashboard.html.erb.这是仪表板视图的布局.
但是我想自定义这个视图,比如添加一个导航栏,它有一个指向我的链接about_path.但是,仪表板视图中不会识别任何路径.它会导致错误undefined method about_path.
但about_path路由在我的路由文件中定义,并且在其他不属于仪表板的视图中正常工作.
rails引擎是否可以识别我的应用程序中定义的路由?
我是Ruby on Rails的新手,使用rails 3.2.13和ruby 1.9.3p392.我正在尝试构建一个应用程序使用的引擎,这可能会导致我的困惑.
引擎名称为sales_app.我有一个页面将大量数据发布到sales_app/sales #create以创建销售.在销售控制器的创建操作中,我做了一些数据处理并尝试实例化Sale对象.我没有从模型中创建对象,而是获取了一个我甚至不知道我正在调用的删除方法的NoMethodError异常.请帮忙.
以下是相关细节.我的销售/新页面将以下参数发布到sales #create:
{"sale"=>{"name"=>"Test",
"desc"=>"This is a test",
"start_date"=>"05/30/2013",
"end_date"=>"05/31/2013",
"start_time"=>"07:00",
"end_time"=>"08:00",
"products"=>""},
"create"=>"Create Sale"}
Run Code Online (Sandbox Code Playgroud)
Sales控制器的创建操作具有以下内容:
def create
if params[:create] == "Create Sale"
# process the data - add a start and end to params
#format = "%m/%d/%Y %H:%M:%S"
params[:sale][:start] = DateTime.strptime("#{params[:sale][:start_date]} #{params[:sale][:start_time]}:00", '%m/%d/%Y %H:%M:%S')
params[:sale][:end] = DateTime.strptime("#{params[:sale][:end_date]} #{params[:sale][:end_time]}:00", '%m/%d/%Y %H:%M:%S')
@sale = Sale.new(:name => params[:sale][:name], :desc => params[:sale][:desc], :start => params[:sale][:start], :end => params[:sale][:end])
if @sale.save
redirect_to @sale
else …Run Code Online (Sandbox Code Playgroud) 我正在构建一个使用Nokogiri gem的rails引擎,我在MacOS 10.7和10.8中遇到了我的开发设置问题:
为了让Nokogiri在我的设置中正常工作,我更新了libxml和libxslt库:
brew update
brew install libxslt
brew upgrade libxml2
gem uninstall nokogiri
gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.0/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.28
Run Code Online (Sandbox Code Playgroud)
如果我在"常规"rails应用程序中使用它,Nokogiri可以正常工作(将它包含在Gemfile中,运行bundle install).
当我尝试从我正在构建的Rails引擎中使用Nokogiri并使用我的应用程序作为宝石时出现问题.
在gemspec中:
s.add_dependency 'nokogiri' # XML parsing
Run Code Online (Sandbox Code Playgroud)
我还在Gem的Gemfile顶部尝试了以下内容:
gem 'nokogiri'
Run Code Online (Sandbox Code Playgroud)
当我启动一个使用我的Rails Engine gem的应用程序时,我收到以下警告:
WARNING: Nokogiri was built against LibXML version 2.9.0, but has dynamically loaded 2.7.8
Run Code Online (Sandbox Code Playgroud)
如何配置gem和/或bundler和/或Rails以使用正确版本的Nokogiri和libxml以及libxslt?
另外,这是输出 nokogiri -v
# Nokogiri (1.5.9)
---
warnings: []
nokogiri: 1.5.9
ruby:
version: 1.9.3
platform: x86_64-darwin12.3.0
description: ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.3.0]
engine: ruby
libxml:
binding: extension
compiled: …Run Code Online (Sandbox Code Playgroud) 在gem中创建生成器时遇到问题.当我运行rails g发电机时显示:
Supportator:
supportator:initializer
Run Code Online (Sandbox Code Playgroud)
但是当我运行发生器rails generate supportator:initializer时发生以下错误:
Could not find generator supportator:initializer.
Run Code Online (Sandbox Code Playgroud)
这是生成器的代码:
require 'rails/generators'
module Supportator
class InitializerGenerator < Rails::Generators::Base
source_root File.expand_path("../templates", __FILE__)
def create_initializer_file
copy_file '_browser_validator.html.haml', 'app/views/_browser_validator.html.haml'
copy_file 'en_supportator.yml' , 'config/locales/en_supportator.yml'
copy_file 'es_supportator.yml' , 'config/locales/es_supportator.yml'
end
end
end
Run Code Online (Sandbox Code Playgroud)
这是引擎的代码:
module Supportator
require 'rails'
class Engine < ::Rails::Engine
end
end
Run Code Online (Sandbox Code Playgroud)
你知道为什么会这样吗?
rails-engines ×10
ruby-on-rails ×10
ruby ×4
dashboard ×1
devise ×1
foreign-keys ×1
generator ×1
libxml2 ×1
nokogiri ×1
rake ×1
routes ×1
rspec ×1