Skip to content

Instantly share code, notes, and snippets.

@Frank004
Last active September 15, 2017 20:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Frank004/22009f5b8f1368d887dbc93139977dff to your computer and use it in GitHub Desktop.
Save Frank004/22009f5b8f1368d887dbc93139977dff to your computer and use it in GitHub Desktop.
This is the value that Im storing in the json
permits: {
"foo_permit"=>{
"can"=>["index", "show", "update", "destroy", "create", "schedule"],
"show"=>"true", "index"=>"true", "create"=>"true", "update"=>"true", "destroy"=>"true", "schedule"=>"true", "controller"=>"Foo"},
...
}
undefined method `with_indifferent_access' for #<String:0x007f9fc7368be8>
Error on console:
Role.all
(Object doesn't support #inspect)
irb(main):025:0> Role.new
=> #<Role id: nil, name: nil, description: nil, permits: {}, created_at: nil, updated_at: nil>
irb(main):026:0> r=_
=> #<Role id: nil, name: nil, description: nil, permits: {}, created_at: nil, updated_at: nil>
irb(main):027:0> r.name = "Test"
=> "Test"
irb(main):028:0> r.description = "test description"
=> "test description"
irb(main):029:0> r.permits= {test1:"test1",test2:"test2"}
=> {:test1=>"test1", :test2=>"test2"}
irb(main):030:0> r.save
NoMethodError: undefined method `with_indifferent_access' for "{\"test1\":\"test1\",\"test2\":\"test2\"}":String
from /Users/IFrank/Documents/HBQuality/hbquality/app/serializers/hash_serializer.rb:7:in `load'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/type/serialized.rb:18:in `deserialize'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activemodel-5.0.5/lib/active_model/type/helpers/mutable.rb:6:in `cast'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute.rb:150:in `type_cast'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute.rb:38:in `value'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute.rb:123:in `changed_from_assignment?'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute.rb:55:in `changed?'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute_mutation_tracker.rb:25:in `changed?'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute_mutation_tracker.rb:9:in `block in changed_values'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute_mutation_tracker.rb:8:in `each'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute_mutation_tracker.rb:8:in `each_with_object'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute_mutation_tracker.rb:8:in `changed_values'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute_methods/dirty.rb:83:in `changed_attributes'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activemodel-5.0.5/lib/active_model/dirty.rb:146:in `changed'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute_methods/dirty.rb:127:in `keys_for_partial_write'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/attribute_methods/dirty.rb:123:in `_create_record'
... 27 levels...
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/transactions.rb:334:in `rollback_active_record_state!'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/transactions.rb:318:in `save'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.0.5/lib/active_record/suppressor.rb:41:in `save'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bullet-5.6.1/lib/bullet/active_record5.rb:5:in `save'
from (irb):30
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.0.5/lib/rails/commands/console.rb:65:in `start'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.0.5/lib/rails/commands/console_helper.rb:9:in `start'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.0.5/lib/rails/commands/commands_tasks.rb:78:in `console'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.0.5/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.0.5/lib/rails/commands.rb:18:in `<main>'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bootsnap-1.1.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:17:in `require'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bootsnap-1.1.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:17:in `require'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activesupport-5.0.5/lib/active_support/dependencies.rb:293:in `block in require'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activesupport-5.0.5/lib/active_support/dependencies.rb:259:in `load_dependency'
from /Users/IFrank/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activesupport-5.0.5/lib/active_support/dependencies.rb:293:in `require'
<%= f.fields_for :foo_permit, OpenStruct.new(f.object.foo_permit || {}) do |foo_permits| %>
<%= foo_permits.check_box :index %>
<%end%>
class CreateRoles < ActiveRecord::Migration
def change
create_table :roles do |t|
t.string :name
t.text :description
t.jsonb :permits, null: false, default: "{}"
t.timestamps null: false
end
end
end
Update migration:
class ChangeRolesPermitsDefault < ActiveRecord::Migration[5.0]
def up
change_column_default :roles, :permits, from: '{}', to: {}
execute "UPDATE roles SET permits = '{}'::jsonb WHERE permits = '\"{}\"'"
end
def down
change_column_default :roles, :permits, from: {}, to: '{}'
execute "UPDATE roles SET permits = '\"{}\"' WHERE permits = '{}'::jsonb"
end
end
Record before the update to rails 5
Role.find_by_name("admin").permits
=> {"foo_permit"=>{"can"=>...
Record after the update to rails 5
Role.find_by_name("client").permits
=> "{\"foo_permit\":{\"controller\...
class Role < ApplicationRecord
# ----------- Association ---------------------------
has_many :users
# ------------ Virtual attributes -------------------
serialize :permits, HashSerializer
store_accessor :permits, :foo_permit,
:bar_permit
end
create_table "roles", force: :cascade do |t|
t.string "name"
t.text "description"
t.jsonb "permits", default: {}, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment