方法 .save 引发 ArgumentError



我更新了项目的RubyRails版本。

红宝石2.2.3–>2.5.1

导轨4.1.8–>5.1.7

当我尝试注册新用户时,出现错误:

ArgumentError (wrong number of arguments (given 2, expected 0..1)):
app/controllers/users/registrations_controller.rb:41:in `create'

这既发生在客户端(前端(也发生在 Rails 控制台。

registrations_controller.rb:

39: def create
40:   build_resource(sign_up_params)
41:   resource_saved = resource.save
42:
43:   yield resource if block_given?
44:
45:   if resource_saved
46:     if resource.active_for_authentication?
...

在 Rails 控制台中:

user = User.new(email: "qwe@test.com", name: "qwe qwe", password: '123123123')
=> #<User id: nil, email: "qwe32@q.com", created_at: nil...
user.save!
ROLLBACK
Traceback (most recent call last):
1: from (irb):4
ArgumentError (wrong number of arguments (given 2, expected 0..1))

用户型号:

class User < ActiveRecord::Base
extend FriendlyId
include InstantSearch
include PushNotificationToFollowers
include CarrierWave::MiniMagick
serialize :site_link, Array
serialize :followers_ids, Array
acts_as_token_authenticatable
acts_as_follower
acts_as_followable
acts_as_liker
acts_as_likeable
attr_accessor   :site_link_raw
mount_uploader :avatar, AvatarUploader
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :omniauthable,
omniauth_providers: [:facebook, :google_oauth2]
validates :name, presence: true
validates :slug, uniqueness: true
validates_format_of :slug, with: /Ad+[a-zA-Z]+S*z|A[^sd]S*z/i, message: 'minimum one letter, without spaces', on: :update
friendly_id :slug_candidates, use: [:slugged, :finders]
{some associations}
before_create :check_slug
after_create :set_membership
after_create :send_welcome_email
after_create :set_settings
ransacker :id,
formatter: ->(bool) {
users_ids = SoundUploader.select(:user_id).where(active:true)
if bool == 'true'
users_ids.present? ?  where("users.id IN (#{users_ids.to_sql})").map(&:id) : nil
else
where("users.id NOT IN (#{users_ids.to_sql})").map(&:id)
end
} do |user|
user.table[:id]
end

def check_slug
unless self.slug.match(/Ad+[a-zA-Z]+S*z|A[^sd]S*z/i)
new_slug = "project-#{self.slug}"
user = User.find_by(slug: new_slug)
new_slug = "#{new_slug}-#{DateTime.current.to_i}" if user
self.slug = new_slug
end
end
def set_membership
self.memberships.create
end
def send_welcome_email
UserMailer.welcome_email(self.id).deliver
end
def set_settings
self.create_setting
end

对于其他型号,我没有收到此错误。

但是对于用户模型,无论我如何调用save方法,此错误总是会出现。

在 Rails 4.x 中,Active Record 模型继承自ActiveRecord::Base。 在 Rails 5.x 中,所有模型都继承自ApplicationRecord

ApplicationRecord是适用于所有应用模型的新超类,类似于 应用控制器子类化ApplicationController而不是ActionController::Base.这为应用提供了单一的配置位置 应用范围的模型行为。

从 Rails4.x 升级到 Rails 5.x 时,您需要创建一个 在应用程序/模型/中application_record.rb文件,并添加以下内容 内容:

class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end

然后确保所有模型都继承自它。

我创建了一个新的应用程序/模型/application_record.rb文件,其中包含以下内容:

class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end

并如@mechnicov指出的那样更改了用户模型。

从:

class User < ActiveRecord::Base
...
end

自:

class User < ApplicationRecord
...
end

最新更新