我需要在开发和生产环境中使用不同版本的gem,因此我将以下内容放入我的gemfile文件。
但是如果我尝试执行
我已经尝试过:
但我仍然收到错误信息。 FYI: 我需要这样做是因为我正在进行rails教程,而在windows、ruby 2.0.0和bcrypt与Heroku之间存在冲突。 因此,我在windows上使用bcrypt 3.1.2(对active record gemfile进行了修改),而在Heroku上使用bcrypt 3.0.1。 更多详情请参见:Issues using bcrypt 3.0.1 with ruby2.0 on Windows 基本上,我做了第一个答案中提到的内容。
编辑:
正如下面的答案所指出的那样,我在生产和开发中确实应该使用相同的版本(即使我只是在跟着教程学习)。 最终我做了个补丁,使用 ActiveModel 来进行修改。
相比之下
group :development, :test do
gem 'rspec-rails', '2.11.0'
gem 'bcrypt-ruby', '3.1.2'
end
group :production do
gem 'rails_12factor'
gem 'bcrypt-ruby', '3.0.1'
end
但是如果我尝试执行
bundle install
, 或者仅仅是rails console
,我会得到上述错误。我已经尝试过:
bundle install --without production
但我仍然收到错误信息。 FYI: 我需要这样做是因为我正在进行rails教程,而在windows、ruby 2.0.0和bcrypt与Heroku之间存在冲突。 因此,我在windows上使用bcrypt 3.1.2(对active record gemfile进行了修改),而在Heroku上使用bcrypt 3.0.1。 更多详情请参见:Issues using bcrypt 3.0.1 with ruby2.0 on Windows 基本上,我做了第一个答案中提到的内容。
编辑:
###################################################################
正如下面的答案所指出的那样,我在生产和开发中确实应该使用相同的版本(即使我只是在跟着教程学习)。 最终我做了个补丁,使用 ActiveModel 来进行修改。
gem 'bcrypt-ruby', '3.1.2'
相比之下
gem 'bcrypt-ruby', '~> 3.0.0'
在secure_password中实现此功能。
我通过将以下内容放置在lib/secure_password_using_3_1_2.rb中来实现。
module ActiveModel
module SecurePassword
extend ActiveSupport::Concern
module ClassMethods
def has_secure_password
# Load bcrypt-ruby only when has_secure_password is used.
# This is to avoid ActiveModel (and by extension the entire framework) being dependent on a binary library.
#gem 'bcrypt-ruby', '~> 3.0.0'
gem 'bcrypt-ruby', '3.1.2'
require 'bcrypt'
attr_reader :password
validates_confirmation_of :password
validates_presence_of :password_digest
include InstanceMethodsOnActivation
if respond_to?(:attributes_protected_by_default)
def self.attributes_protected_by_default
super + ['password_digest']
end
end
end
end
end
end
然后将以下内容添加到config/environment.rb中
require File.expand_path('../../lib/secure_password_using_3_1_2.rb', __FILE__)