rails ruby 中的未定义方法“unserialize_attribute”
undefined method `unserialize_attribute' in ruby on rails
我正在升级 rails 应用程序,我在 rails 3
中有一个方法 unserialize_attribue
但我在 rails 5
中看不到这个方法。
rails 5 中 unserialize_attribute
的替代方案是什么,或者对我能做什么有任何建议,谢谢
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
反序列化的属性值。
我使用 serializable_hash 让它工作,它在 rails 3
和 rails 5
中可用
我把这段代码写在 rails 3
unserialized_value = unserialize_attribute(options[:serialized_column]) || { }
我改成了
unserialized_value = self.serializable_hash[options[:serialized_column]] || { }
两种方法returns相同的散列对象。
我正在升级 rails 应用程序,我在 rails 3
中有一个方法 unserialize_attribue
但我在 rails 5
中看不到这个方法。
rails 5 中 unserialize_attribute
的替代方案是什么,或者对我能做什么有任何建议,谢谢
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
反序列化的属性值。
我使用 serializable_hash 让它工作,它在 rails 3
和 rails 5
我把这段代码写在 rails 3
unserialized_value = unserialize_attribute(options[:serialized_column]) || { }
我改成了
unserialized_value = self.serializable_hash[options[:serialized_column]] || { }
两种方法returns相同的散列对象。