【问题标题】:undefined method `unserialize_attribute' in ruby on railsruby on rails 中未定义的方法“unserialize_attribute”
【发布时间】:2019-01-07 11:26:54
【问题描述】:

我正在升级 Rails 应用程序,我在 rails 3 中有一个方法 unserialize_attribue,但我在 rails 5 中看不到这个方法。

rails 5 中unserialize_attribute 的替代方法是什么,或者对我能做什么有任何建议,谢谢

【问题讨论】:

  • 您希望您的未序列化属性看起来如何?
  • 您的未序列化属性在 rails 3 中看起来如何?
  • 我正在尝试从 3.1.12 更新到 rails 3.2.22,但仍然收到 vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.22.5/lib/active_support/core_ext/module/aliasing.rb:31:in 'alias_method': undefined method 'unserialize_attribute' for class ActiveRecord::Base' (NameError)` 的错误。你能帮我解决这个问题吗?

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-5 ruby-on-rails-5.1


【解决方案1】:

unserialize_attribute 已从 rails-5 中删除,但您可以以不同的方式对值进行反序列化,

方法:1

> @user.accessible_attribute
# => {"attr1"=>["Email id"], "attr2"=>["First Name"], "attr3"=>["Last Name"]}

> @user.attributes_before_type_cast['accessible_attribute']
# => "--- !ruby/hash:ActionController::Parameters\nattr1:\n- Email id\nattr2:\n- First Name\nattr3:\n- Last Name\n"

方法:2

@user.instance_variable_get(:@attributes)['accessible_attribute'].value_before_type_cast
# => "--- !ruby/hash:ActionController::Parameters\nattr1:\n- Email id\nattr2:\n- First Name\nattr3:\n- Last Name\n"

方法:3

> @accessible_attribute = ActiveRecord::Base.connection.execute("SELECT accessible_attribute FROM users WHERE id = #{@user.id}")
   (0.4ms)  SELECT accessible_attribute FROM users WHERE id = 3
# => #<Mysql2::Result:0xe0fc374 @query_options={:as=>:array, :async=>false, :cast_booleans=>false, :symbolize_keys=>false, :database_timezone=>:utc, :application_timezone=>nil, :cache_rows=>true, :connect_flags=>-2147442171, :cast=>true, :default_file=>nil, :default_group=>nil, :adapter=>"mysql2", :encoding=>"utf8mb4", :collation=>"utf8mb4_unicode_ci", :database=>"example_development", :pool=>5, :username=>"root", :password=>"password", :socket=>"/var/run/mysqld/mysqld.sock", :flags=>2}>

> @accessible_attribute.first[0]
# => "--- !ruby/hash:ActionController::Parameters\nattr1:\n- Email id\nattr2:\n- First Name\nattr3:\n- Last Name\n"

注意:准确地说,有些人更喜欢采用@user.accessible_attribute.to_yaml 反序列化的属性值。

【讨论】:

  • YAML.parse(unserialized_column_data).to_ruby 再次提供哈希
【解决方案2】:

我使用serializable_hash 让它工作,它在rails 3rails 5 中可用

我在 rails 3 中编写了这段代码

unserialized_value = unserialize_attribute(options[:serialized_column]) || { }

我改成了

unserialized_value = self.serializable_hash[options[:serialized_column]] || { }

两种方法都返回相同的哈希对象。

【讨论】:

  • 我不清楚它如何解决您提出的问题,但很高兴它对您有用。如果你解释你做了多少改变,那就太好了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2016-02-17
  • 2014-09-21
  • 1970-01-01
  • 2016-12-15
相关资源
最近更新 更多