Closed Yoshyn closed 7 years ago
Hi.
I just find a bug in the gem that force me to remove strong_parameter in my app.
Here is the code that work (rails only)
unless File.exist?('Gemfile') File.write('Gemfile', <<-GEMFILE) source 'https://rubygems.org' gem 'rails', '~> 4.2' #, github: 'rails/rails' gem 'arel' #, github: 'rails/arel' gem 'sqlite3' GEMFILE system 'bundle' end require 'bundler' Bundler.setup(:default) require 'active_record' require 'minitest/autorun' require 'logger' # This connection will do for database-independent bug reports. ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:') ActiveRecord::Base.logger = Logger.new(STDOUT) ActiveRecord::Schema.define do create_table :posts, force: true do |t| t.string :title end create_table :post_infos, force: true do |t| t.integer :post_id t.string :basic_field t.string :prepended_field end end module Prepends module Post def post_info merged_attributes = { prepended_field: 'YATA' }.stringify_keys.merge(super().try(:attributes) || {}) if super.nil? send(:build_post_info, merged_attributes ) elsif (!super().valid? && self.new_record?) super().attributes = merged_attributes super() else super() end end end end class Post < ActiveRecord::Base prepend Prepends::Post has_one :post_info, dependent: :destroy accepts_nested_attributes_for :post_info, allow_destroy: true end class PostInfo < ActiveRecord::Base belongs_to :post validates :prepended_field, presence: true end class BugTest < Minitest::Test def test_association_stuff post = Post.new( { title: 'Testing', post_info_attributes: { basic_field: 'YOLO' } } ) post.save! assert_equal 1, PostInfo.count assert_equal post.id, PostInfo.first.post.id assert_equal 'YOLO', PostInfo.first.basic_field assert_equal 'YATA', PostInfo.first.prepended_field end end
Here is the code that failed (with protected_attributes)
unless File.exist?('Gemfile') File.write('Gemfile', <<-GEMFILE) source 'https://rubygems.org' gem 'rails', '~> 4.2' #, github: 'rails/rails' gem 'arel' #, github: 'rails/arel' gem 'sqlite3' gem 'protected_attributes' GEMFILE system 'bundle' end require 'bundler' Bundler.setup(:default) require 'active_record' require 'minitest/autorun' require 'logger' require 'protected_attributes' # This connection will do for database-independent bug reports. ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:') ActiveRecord::Base.logger = Logger.new(STDOUT) ActiveRecord::Schema.define do create_table :posts, force: true do |t| t.string :title end create_table :post_infos, force: true do |t| t.integer :post_id t.string :basic_field t.string :prepended_field end end module Prepends module Post def post_info merged_attributes = { prepended_field: 'YATA' }.stringify_keys.merge(super().try(:attributes) || {}) if super.nil? send(:build_post_info, merged_attributes ) elsif (!super().valid? && self.new_record?) super().attributes = merged_attributes super() else super() end end end end class Post < ActiveRecord::Base prepend Prepends::Post has_one :post_info, dependent: :destroy accepts_nested_attributes_for :post_info, allow_destroy: true attr_accessible :title, :post_info_attributes end class PostInfo < ActiveRecord::Base belongs_to :post validates :prepended_field, presence: true attr_accessible :basic_field, :prepended_field end class BugTest < Minitest::Test def test_association_stuff post = Post.new( { title: 'Testing', post_info_attributes: { basic_field: 'YOLO' } } ) post.save! assert_equal 1, PostInfo.count assert_equal post.id, PostInfo.first.post.id assert_equal 'YOLO', PostInfo.first.basic_field assert_equal 'YATA', PostInfo.first.prepended_field end end
Which produce :
Finished in 0.028528s, 35.0529 runs/s, 0.0000 assertions/s. 1) Error: BugTest#test_association_stuff: ActiveRecord::RecordInvalid: Validation failed: Post info prepended field can't be blank ~/codes/tmp/.gems/gems/activerecord-4.2.1/lib/active_record/validations.rb:79:in `raise_record_invalid' 1 runs, 0 assertions, 0 failures, 1 errors, 0 skips ``
Yeah. I don't think there is a way to make this gem work with prepend but I had not investigate it yet. Could you check that?
prepend
Closing because of it is stale
Hi.
I just find a bug in the gem that force me to remove strong_parameter in my app.
Here is the code that work (rails only)
Here is the code that failed (with protected_attributes)
Which produce :