我想升级到Rails的4.0.0,和我换的宝石版本sass-rails
和coffee-rails
.我需要在升级到Rails 4之前rails
和coffee-rails
之前解决这个gem冲突.
当我运行时,bundle update
这是我得到的输出:
$ bundle update
Updating git://github.com/pilu/web-app-theme.git
Fetching source index from https://rubygems.org/
Resolving dependencies..............
Bundler could not find compatible versions for gem "railties":
In Gemfile:
rails (= 4.0.0) ruby depends on
railties (= 4.0.0) ruby
coffee-rails (= 4.0.0) ruby depends on
railties (4.0.0.rc2)
Run Code Online (Sandbox Code Playgroud)
我的Gemfile
:
source 'https://rubygems.org'
gem 'rails', '4.0.0'
gem 'cancan'
gem 'client_side_validations'
gem 'devise', '~> 1.5.3'
gem 'dynamic_form'
gem 'execjs'
gem 'haml'
gem 'httparty'
gem …
Run Code Online (Sandbox Code Playgroud) 操作系统是Ubuntu 12.04,64位.
新的铁路.相对较新的Ruby.遵循ruby.railstutorial.org教程,第3章.
本教程已更新为使用ruby 2.0.0和Rails 4.0.0.rc1.以前gemfile是指定Rails 3.2.13而不是指定Ruby版本.在转到教程中的最新Gemfile,ruby 2.0.0和Rails 4.0.0.rc1之后,运行rails命令时出现以下错误.这里的示例是rails服务器
user@machine:~/bin/railslearn/sample_app$ rails server
/home/paul/bin/railslearn/sample_app/config/application.rb:7:in `require': cannot load such file -- active_resource/railtie (LoadError)
from /home/paul/bin/railslearn/sample_app/config/application.rb:7:in `<top (required)>'
from /home/paul/.rvm/gems/ruby-2.0.0-p195@railstutorial_rails_4_0/gems/railties-4.0.0.rc1/lib/rails/commands.rb:78:in `require'
from /home/paul/.rvm/gems/ruby-2.0.0-p195@railstutorial_rails_4_0/gems/railties-4.0.0.rc1/lib/rails/commands.rb:78:in `block in <top (required)>'
from /home/paul/.rvm/gems/ruby-2.0.0-p195@railstutorial_rails_4_0/gems/railties-4.0.0.rc1/lib/rails/commands.rb:75:in `tap'
from /home/paul/.rvm/gems/ruby-2.0.0-p195@railstutorial_rails_4_0/gems/railties-4.0.0.rc1/lib/rails/commands.rb:75:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
Run Code Online (Sandbox Code Playgroud)
我确实从Rails得到了一些想法:找不到下面列出的铁路,但还没有找到解决办法.
这是细节.
昨天(在我的浏览器中)第3章的Gemfile如下所示.一切都很好.
$ cat Gemfile
source 'https://rubygems.org'
gem 'rails', '3.2.13'
gem 'bootstrap-sass', '2.1'
gem 'bcrypt-ruby', '3.0.1'
gem 'faker', '1.0.1'
gem 'will_paginate', '3.0.3'
gem 'bootstrap-will_paginate', '0.0.6' …
Run Code Online (Sandbox Code Playgroud) rubygems ruby-on-rails railstutorial.org gem-bundler railtie
我读了一些关于这些论点的文件,但我不清楚它们是什么,它们之间有什么区别,如果其中一个符合我的需要.
我需要编写一个可插入其他应用程序的应用程序,并希望将其作为gem包含在其他应用程序中.基本上我需要一些模型,一个控制器和没有视图,加上一些初始化,支持来自托管应用程序和生成器的配置参数.
我是正确的吗?
我应该阅读什么才能理解如何做到这一点?
更新:
有很多细节AF一个很不错的文章,可以发现在这里.
实质上:
Railtie是Rails框架的核心,它提供了几个钩子来扩展Rails和/或修改初始化过程.
Rails :: Engine只不过是一个已经设置了一些初始化程序的Railtie.由于Rails :: Application和Rails :: Plugin是引擎,因此这里描述的相同配置可以在所有三个中使用.
在制作Passenger-Monit插件时,我认为使用初始化器是最合适的,即
module PassengerMonit
class Railtie < Rails::Railtie
initializer "my_plugin.some_init_task" do
# my initialization tasks
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是,由于某种原因,块中的代码从未执行过.我终于做了一个解决方案
config.before_initialize {}
Run Code Online (Sandbox Code Playgroud)
但我很好奇,为什么初始化程序没有被执行.有什么可以阻止它运行?
我正在尝试将我的应用程序从Rails 3.2.13切换到Rails 4.这样做,我遇到了一个主要障碍 - 我使用gem mobile_fu来确定用户是否来自移动设备.那个宝石需要3.2.13的栏杆,但轨道4.0.2和轨道4.0.2的sass-rails都要求栏杆> = 4.0.
什么是解决这个问题的好方法?我很乐意深入研究mobile_fu代码,因为它似乎并不特别棘手,但我在处理铁路以及对铁路的依赖性方面的经验很少.
谢谢!
我有几个邮件预览下spec/mailer/previews
.在development
我可以查看下的所有预览/rails/mailers/
.但是,默认情况下,此功能在其他环境中不存在.
我想在staging
环境中启用它,并在这里从这篇文章中排队.
我做了以下更改 -
# Add the routes manually
if Rails.env.staging?
get "/rails/mailers" => "rails/mailers#index"
get "/rails/mailers/*path" => "rails/mailers#preview"
end
Run Code Online (Sandbox Code Playgroud)
Rails.application.configure do
# Define the mailer preview path
config.action_mailer.preview_path = "spec/mailers/previews"
# Specifically add that path and all files under it to the autoload paths
config.autoload_paths = Dir["#{config.root}/#{config.action_mailer.preview_path}/**"]
end
class ::Rails::MailersController
include Rails.application.routes.url_helpers
# Override the method just for this controller so `MailersController` thinks …
Run Code Online (Sandbox Code Playgroud) 有没有办法禁用默认情况下由 gem 加载的 Railtie?
gem 的开发人员并没有将其模块化,一旦将 gem 放入 Gemfile 中,require 就会自动以这种方式加载 Railties:
require 'some_gem'
module SomeGem
module RailtieMixin
extend ActiveSupport::Concern
included do
rake_tasks do
require 'some_gem/rake_tasks'
end
initializer 'some_gem.configuration' do
config.after_initialize do
...
end
end
initializer 'some_gem.controller_methods' do
...
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
我想进行一些控制,最好仅禁用'some_gem.controller_methods'
,可以这样做吗?没有猴子补丁?不修补宝石?
我最近从gem版本切换resources_controller
到了依赖plugin
的gem
版本git
.
在vendor/plugins/plugin/lib/plugin.rb
文件内部,Railtie
如下:
module Ardes
module ResourcesController
class Railtie < Rails::Railtie
initializer 'ardes.resources_controller' do
ActiveSupport.on_load(:action_controller) do
extend Ardes::ResourcesController
include Ardes::ResourcesController::RequestPathIntrospection
end
ActiveSupport.on_load(:active_record) do
include Ardes::ActiveRecord::Saved
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
我已经require 'resources_controller'
在我的一个初始化程序中添加了一个并正确加载此文件.问题是虽然Railtie
被评估(puts
类块中的一个将被击中),但它似乎永远不会实际调用初始化块本身.这当然很重要,因为这是扩展ActionController
到包括resources_controller_for
方法的地方.
这个问题似乎已经出现在这里和这里.虽然在这两种情况下他们都找到了解决问题的其他方法,但没有直接回答为什么没有调用块.
从我在Rails文档中可以看出,您可以将初始化程序块命名为您想要的任何内容,并且它应该运行.我认为这不重要,但我在生产中运行时首先注意到了这个问题,rails s -e production
但我相信在开发模式中存在同样的问题.
可能会发生什么?
作为参考,完整的插件在这里:https://github.com/ianwhite/resources_controller
我正在为我的Rails应用程序开发一个gem,它将通过Railtie加载到它中.我基本上是在旧的Rails应用程序风格中插入模型,加上库和一些初始化器.我主要担心的是在整个Rails应用程序加载逻辑中并不完全知道我应该最好插入它们.我的要求是:gem初始化器必须在app初始化器之前加载,与libs相同,初始化器访问lib信息.在Rails应用程序工作流程中,它以某种方式工作.我的短期解决方法如下:
module Gemname
def self.initialize_railtie
ActiveSupport.on_load :active_record do
require 'gemname/lib'
require 'gemname/initializers'
end
end
class Railtie < Rails::Railtie
initializer 'gemname.insert_into_app' do
Gemfile.initialize_railtie
end
end
Run Code Online (Sandbox Code Playgroud)
所以这样,我确定在初始化器之前加载了libs.我非常确定有更好的方法,即访问一些铁路钩子,这允许我使用应用程序库加载我的库,使用应用程序初始化器加载初始化程序.我似乎无法找到它们.
我有自己的宝石,我的护发带看起来像...
class MyRailtie < Rails::Railtie
initializer "my_railtie.configure_rails_initialization" do
# some initialization behavior
end
end
Run Code Online (Sandbox Code Playgroud)
并且我正在尝试对其进行测试,但是在测试中,初始化器从未被调用。而且我注意到我也依赖于另一个具有初始化程序的gem,它们也不会被调用。
您是否知道除了需要文件外还应该做什么?
railtie ×10
gem ×3
ruby ×2
actionmailer ×1
bundler ×1
gem-bundler ×1
initializer ×1
rubygems ×1