I have a model ‘xp_jurisdiction_taxes’ which rails (3) created correctly.
Another model ‘xp_jurisdiction_states’ has many :xp_jurisdiction_taxes.
In my spec I am using a shoulda helper to test the association but get the following error. BTW, greped the whole project just in case and the string ‘taxi’ exists nowhere.
XpJurisdictionStates
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant XpJurisdictionStates::XpJurisdictionTaxis
./spec/models/xp_jurisdiction_states_spec.rb:4:in `block (2 levels) in <top (required)>’
Not sure if this is a rails or shoulda issue (I am starting to think it is shoulda). Any input?
Correction — I had originally misnamed the models by plural, however once fixed now, still same problem. I think this is a shoulda issue as I can associate and access the models and associations correctly in the console.
Correction --- I had originally misnamed the models by plural, however once
fixed now, still same problem. I think this is a shoulda issue as I can
associate and access the models and associations correctly in the console.
Can you confirm the model, association and table names please?
Correction — I had originally misnamed the models by plural, however once
fixed now, still same problem. I think this is a shoulda issue as I can
associate and access the models and associations correctly in the console.
Can you confirm the model, association and table names please?
Thanks Colin, here are the models and tables. Also to be sure went in to db console and verified the actual table names just in case something went awry. Also at bottom are the three rspec/shoulda errors. I have to be doing something wrong but if I am I don’t see it.
class XpJurisdictionState < ActiveRecord::Base
has_many :xp_jurisdiction_taxes
end
class XpJurisdictionTax < ActiveRecord::Base
belongs_to :account_subcode
belongs_to :xp_jurisdiction_states
end
create_table “xp_jurisdiction_states”, :force => true do |t|
public | xp_jurisdiction_states | table | postgres
public | xp_jurisdiction_states_id_seq | sequence | postgres
public | xp_jurisdiction_taxes | table | postgres
public | xp_jurisdiction_taxes_id_seq | sequence | postgres
AccountSubcode
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant AccountSubcode::XpJurisdictionTaxis
./spec/models/account_subcode_spec.rb:16:in `block (2 levels) in <top (required)>’
XpJurisdictionState
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant XpJurisdictionState::XpJurisdictionTaxis
./spec/models/xp_jurisdiction_state_spec.rb:4:in `block (2 levels) in <top (required)>’
XpJurisdictionTax
Failure/Error: it { should belong_to(:xp_jurisdiction_states) }
Expected XpJurisdictionTax to have a belongs_to association called xp_jurisdiction_states (XpJurisdictionTax does not have a xp_jurisdiction_states_id foreign key.)
...
Thanks Colin, here are the models and tables. Also to be sure went in to db
console and verified the actual table names just in case something went
awry. Also at bottom are the three rspec/shoulda errors. I have to be doing
something wrong but if I am I don't see it.
class XpJurisdictionState < ActiveRecord::Base
has_many :xp_jurisdiction_taxes
end
class XpJurisdictionTax < ActiveRecord::Base
belongs_to :account_subcode
belongs_to :xp_jurisdiction_states
that should be :xp_jurisdiction_state. It belongs to one state so singular.
end
create_table "xp_jurisdiction_states", :force => true do |t|
t.string "state_code"
t.string "state"
t.string "billing_item"
t.string "billing_memo"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "xp_jurisdiction_taxes", :force => true do |t|
t.integer "xp_jurisdiction_state_id"
t.integer "account_subcode_id"
t.decimal "tax"
t.datetime "created_at"
t.datetime "updated_at"
end
public | xp_jurisdiction_states | table | postgres
public | xp_jurisdiction_states_id_seq | sequence | postgres
public | xp_jurisdiction_taxes | table | postgres
public | xp_jurisdiction_taxes_id_seq | sequence | postgres
1) AccountSubcode
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant AccountSubcode::XpJurisdictionTaxis
If you run a console and type
"tax".pluralize you will get "taxes" which is correct. However on
rails 3.0.5 if I type "taxes".singularize I get taxis which is not
what you want. I assume it is using the same rule as would apply for
axis and axes. The solution is to specify your own rules for your
xp_jurisidiction_tax and taxes and then you should be ok.
\# \./spec/models/account\_subcode\_spec\.rb:16:in \`block \(2 levels\) in <top
(required)>'
2) XpJurisdictionState
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant XpJurisdictionState::XpJurisdictionTaxis
# ./spec/models/xp_jurisdiction_state_spec.rb:4:in `block (2 levels) in
<top (required)>'
3) XpJurisdictionTax
Failure/Error: it { should belong_to(:xp_jurisdiction_states) }
Again should be singular, so that explains that problem I think.
./spec/models/account_subcode_spec.rb:16:in `block (2 levels) in <top (required)>’
XpJurisdictionState
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant XpJurisdictionState::XpJurisdictionTaxis
./spec/models/xp_jurisdiction_state_spec.rb:4:in `block (2 levels) in <top (required)>’
So… all the important tests are failing but not my shoulda checks on my model relations. I can just drop these lines in my tests and be ok as other code is essentially checking these via its actions, but is leaving a mystery still open as to why. It seems to me that shoulda is doing something funky in determining what it expects, which on the surface seems strange (I mean, if I say the relation should be :xp_jurisdiction_taxes… there is nothing to infer… that symbol is the same in the shoulda/rspec and in the class it is testing…
Anyhow, if you all have any other input, appreciated. Seems to me next step will be to see if I can trace this through the shoulda source code, although not really in a place timewise right now…
...
*BUT* some piece of code is still deciding that I have 'taxis' and not
'taxes' --- spec still failing:
1) AccountSubcode
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant AccountSubcode::XpJurisdictionTaxis
# ./spec/models/account_subcode_spec.rb:16:in `block (2 levels) in <top
(required)>'
It seems as if shoulda is not picking up the inflections for some
reason. I don't use shoulda, can you output debug during its
execution? Is so what happens if you output
"xp_jurisdiction_taxes".singularize and "taxes".singularize?
2) XpJurisdictionState
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant XpJurisdictionState::XpJurisdictionTaxis
# ./spec/models/xp_jurisdiction_state_spec.rb:4:in `block (2 levels) in
<top (required)>'
So... all the important tests are failing but not my shoulda checks on my