Raise 'column_name undefined error' when column not present

When using enum for state column and enum config not set explicitly,
if column is not present in database then "NoMethodError: undefined
method 'type' for nil:NilClass" was raised for transitions which is
hard to debug.
Fix #152
This commit is contained in:
Anil 2015-10-04 03:20:33 +05:30
parent 64a133407d
commit 0faff1fcf0
5 changed files with 62 additions and 2 deletions

View File

@ -96,7 +96,10 @@ module AASM
end
def aasm_column_looks_like_enum(name=:default)
self.class.columns_hash[self.class.aasm(name).attribute_name.to_s].type == :integer
column_name = self.class.aasm(name).attribute_name.to_s
column = self.class.columns_hash[column_name]
raise NoMethodError.new("undefined method '#{column_name}' for #{self.class}") if column.nil?
column.type == :integer
end
def aasm_guess_enum_method(name=:default)

View File

@ -1,5 +1,5 @@
ActiveRecord::Migration.suppress_messages do
%w{gates multiple_gates readers writers transients simples no_scopes multiple_no_scopes no_direct_assignments multiple_no_direct_assignments thieves multiple_thieves localizer_test_models persisted_states provided_and_persisted_states with_enums with_true_enums with_false_enums false_states multiple_with_enums multiple_with_true_enums multiple_with_false_enums multiple_false_states readme_jobs}.each do |table_name|
%w{gates multiple_gates readers writers transients simples no_scopes multiple_no_scopes no_direct_assignments multiple_no_direct_assignments thieves multiple_thieves localizer_test_models persisted_states provided_and_persisted_states with_enums with_enum_without_columns multiple_with_enum_without_columns with_true_enums with_false_enums false_states multiple_with_enums multiple_with_true_enums multiple_with_false_enums multiple_false_states readme_jobs}.each do |table_name|
ActiveRecord::Migration.create_table table_name, :force => true do |t|
t.string "aasm_state"
end

View File

@ -0,0 +1,35 @@
class WithEnumWithoutColumn < ActiveRecord::Base
include AASM
enum status: {
opened: 0,
closed: 1
}
aasm :column => :status do
state :closed, initial: true
state :opened
event :view do
transitions :to => :opened, :from => :closed
end
end
end
class MultipleWithEnumWithoutColumn < ActiveRecord::Base
include AASM
enum status: {
opened: 0,
closed: 1
}
aasm :left, :column => :status do
state :closed, initial: true
state :opened
event :view do
transitions :to => :opened, :from => :closed
end
end
end

View File

@ -113,6 +113,17 @@ describe "instance methods" do
end
end
end
context "when AASM enum setting is not enabled and aasm column not present" do
before :each do
@multiple_with_enum_with_column = MultipleWithEnumWithoutColumn.new
end
it "should raise NoMethodError for transitions" do
expect{@multiple_with_enum_with_column.send(:view, :left)}.to raise_error(NoMethodError, "undefined method 'status' for MultipleWithEnumWithoutColumn")
end
end
end
context "when AASM is configured to use enum" do

View File

@ -113,6 +113,17 @@ describe "instance methods" do
end
end
end
context "when AASM enum setting is not enabled and aasm column not present" do
before :each do
@with_enum_with_column = WithEnumWithoutColumn.new
end
it "should raise NoMethodError for transitions" do
expect{@with_enum_with_column.send(:view)}.to raise_error(NoMethodError, "undefined method 'status' for WithEnumWithoutColumn")
end
end
end
context "when AASM is configured to use enum" do