Reputation: 3284
I'm configuring my rails 5.1.4 model to support states via aasm, I'm having a problem with it, apparently it doesn't initialize the method state
for the model. Which seems to be used when I call item.save
so breaks my model. Other methods seem to work fine.
I configured (and ran) my migration like this:
add_column :item, :aasm_state, :string
and configured it in the item.rb model file:
class Item
include AASM
[...]
aasm do
state :unpublished, initial: true
state :published
state :blocked
event :publish do
transitions from: :unpublished, to: :published
end
event :unpublish do
transitions from: :published, to: :unpublished
end
event :block do
transitions from: :published, to: :blocked
end
event :unblock do
transitions from: :blocked, to: :published
end
end
[...]
end
in the rails console I type:
> item = Item.new
=> #<Item id: nil, title: nil, description: nil, created_at: nil, updated_at: nil, aasm_state: "unpublished">
> item.aasm_statenike
=> "unpublished"
> item.aasm.states.map(&:name)
=> [:unpublished, :published, :blocked]
> item.state #<===== WHERE IS STATE?
NoMethodError: undefined method `state' for #<Item:0x007f8d43263810>
from (irb):2
> item.save
NoMethodError: undefined method `state' for #<Item:0x007f8d4a30f550>
Did you mean? state=
from (irb):3
> item.publish
=> true
> item.aasm_state
=> "published"
> item.state #<===== WHERE IS STATE?
NoMethodError: undefined method `state' for #<Item:0x007f8d43263810>
from (irb):9
UPDATE adding the full stacktrace:
> begin
* item.save!
* rescue NoMethodError => e
* puts e.backtrace
* end
(1.0ms) BEGIN
(0.7ms) ROLLBACK
/Users/user/.rvm/gems/ruby-2.4.1/gems/activemodel-5.1.4/lib/active_model/attribute_methods.rb:432:in `method_missing'
/Users/user/.rvm/gems/ruby-2.4.1/gems/aasm-4.12.3/lib/aasm/persistence/base.rb:36:in `aasm_read_state'
/Users/user/.rvm/gems/ruby-2.4.1/gems/aasm-4.12.3/lib/aasm/instance_base.rb:12:in `current_state'
/Users/user/.rvm/gems/ruby-2.4.1/gems/aasm-4.12.3/lib/aasm/persistence/active_record_persistence.rb:157:in `aasm_invalid_state?'
/Users/user/.rvm/gems/ruby-2.4.1/gems/aasm-4.12.3/lib/aasm/persistence/active_record_persistence.rb:149:in `block in aasm_validate_states'
/Users/user/.rvm/gems/ruby-2.4.1/gems/aasm-4.12.3/lib/aasm/persistence/active_record_persistence.rb:147:in `each'
/Users/user/.rvm/gems/ruby-2.4.1/gems/aasm-4.12.3/lib/aasm/persistence/active_record_persistence.rb:147:in `aasm_validate_states'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:413:in `block in make_lambda'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:197:in `block (2 levels) in halting'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:601:in `block (2 levels) in default_terminator'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:600:in `catch'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:600:in `block in default_terminator'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:198:in `block in halting'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:507:in `block in invoke_before'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:507:in `each'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:507:in `invoke_before'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:130:in `run_callbacks'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:827:in `_run_validate_callbacks'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activemodel-5.1.4/lib/active_model/validations.rb:405:in `run_validations!'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activemodel-5.1.4/lib/active_model/validations/callbacks.rb:110:in `block in run_validations!'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:131:in `run_callbacks'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:827:in `_run_validation_callbacks'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activemodel-5.1.4/lib/active_model/validations/callbacks.rb:110:in `run_validations!'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activemodel-5.1.4/lib/active_model/validations.rb:335:in `valid?'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/validations.rb:65:in `valid?'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/validations.rb:82:in `perform_validations'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/validations.rb:50:in `save!'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/attribute_methods/dirty.rb:43:in `save!'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/transactions.rb:313:in `block in save!'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/transactions.rb:384:in `block in with_transaction_returning_status'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/connection_adapters/abstract/database_statements.rb:235:in `block in transaction'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:194:in `block in within_new_transaction'
/Users/user/.rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/connection_adapters/abstract/transaction.rb:191:in `within_new_transaction'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/connection_adapters/abstract/database_statements.rb:235:in `transaction'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/transactions.rb:210:in `transaction'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/transactions.rb:381:in `with_transaction_returning_status'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/transactions.rb:313:in `save!'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/suppressor.rb:46:in `save!'
(pry):4:in `<main>'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/pry_instance.rb:355:in `eval'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/pry_instance.rb:355:in `evaluate_ruby'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/pry_instance.rb:323:in `handle_line'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/pry_instance.rb:242:in `catch'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/pry_instance.rb:242:in `block in eval'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/pry_instance.rb:241:in `catch'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/pry_instance.rb:241:in `eval'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/repl.rb:77:in `block in repl'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/repl.rb:67:in `loop'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/repl.rb:67:in `repl'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/repl.rb:38:in `block in start'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/input_lock.rb:61:in `__with_ownership'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/input_lock.rb:79:in `with_ownership'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/repl.rb:38:in `start'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/repl.rb:15:in `start'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-0.10.4/lib/pry/pry_class.rb:169:in `start'
/Users/user/.rvm/gems/ruby-2.4.1/gems/pry-nav-0.2.4/lib/pry-nav/pry_ext.rb:17:in `start_with_pry_nav'
/Users/user/.rvm/gems/ruby-2.4.1/gems/railties-5.1.4/lib/rails/commands/console/console_command.rb:62:in `start'
/Users/user/.rvm/gems/ruby-2.4.1/gems/railties-5.1.4/lib/rails/commands/console/console_command.rb:17:in `start'
/Users/user/.rvm/gems/ruby-2.4.1/gems/railties-5.1.4/lib/rails/commands/console/console_command.rb:97:in `perform'
/Users/user/.rvm/gems/ruby-2.4.1/gems/thor-0.20.0/lib/thor/command.rb:27:in `run'
/Users/user/.rvm/gems/ruby-2.4.1/gems/thor-0.20.0/lib/thor/invocation.rb:126:in `invoke_command'
/Users/user/.rvm/gems/ruby-2.4.1/gems/thor-0.20.0/lib/thor.rb:387:in `dispatch'
/Users/user/.rvm/gems/ruby-2.4.1/gems/railties-5.1.4/lib/rails/command/base.rb:63:in `perform'
/Users/user/.rvm/gems/ruby-2.4.1/gems/railties-5.1.4/lib/rails/command.rb:44:in `invoke'
/Users/user/.rvm/gems/ruby-2.4.1/gems/railties-5.1.4/lib/rails/commands.rb:16:in `<top (required)>'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:292:in `require'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:292:in `block in require'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:258:in `load_dependency'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:292:in `require'
/Users/user/Documents/user/project/project/bin/rails:9:in `<top (required)>'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:286:in `load'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:286:in `block in load'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:258:in `load_dependency'
/Users/user/.rvm/gems/ruby-2.4.1/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:286:in `load'
/Users/user/.rvm/rubies/ruby-2.4.1/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/Users/user/.rvm/rubies/ruby-2.4.1/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
-e:1:in `<main>'
=> nil
Upvotes: 1
Views: 2415
Reputation: 27747
AASM doesn't create a method called state
on your model by default.
It used to, many years ago... but problems occurred when our models already had a column called state
(eg when it was an Address model).
If you want to access the current state of a model, you need to use the AASM method current_state
like this:
item.aasm.current_state
More in the aasm doco here
Upvotes: 1