在Ruby on Rails中出现了未定义方法'unserialize_attribute'的错误。

4

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

在rails 5中有什么替代unserialize_attribute的方法或建议我该怎么做,谢谢。


你希望你的未序列化属性看起来像什么? - ray
在Rails 3中,你的未序列化属性是什么样子? - Dyaniyal Wilson
我正在尝试从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)”。你能帮助我解决这个问题吗? - Vishal
2个回答

5

unserialize_attributerails-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"

方法二:

@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"

方法三:

> @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 再次提供哈希。 - ray

0

我使用serializable_hash使其工作,并且它在rails 3以及rails 5中都可用。

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

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

我改成了

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

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


我不清楚它如何成为你提出问题的解决方案,但很高兴它对你起作用了。如果你能解释一下你做了多少更改,那就太好了。 - ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接