Рельсы 3.1 проблема перегиба
У меня есть приложение Rails 3.1 со следующими 2 моделями
class Listing < ActiveRecord::Base
has_many :listing_saves
end
class Team < ActiveRecord::Base
has_many :listing_saves
has_many :saved_listings, through: :listing_saves, source: 'listing'
end
Модель Join выглядит следующим образом
class ListingSave < ActiveRecord::Base
belongs_to :team
belongs_to :listing
end
Теперь я думаю, что существует проблема перегиба, потому что всякий раз, когда я пытаюсь запустить свои тесты, я получаю следующую ошибку (это пример ошибки и теста, который ее вызвал)
it "should return the listing saves associated with the team" do
save = Factory :listing_save, listing: @listing, saver: @user, team: @team
@team.listing_saves.should include save
end
Failures:
1) Team listing_saves associations should return the listing saves associated with the team
Failure/Error: @team.listing_saves.should include save
NameError:
uninitialized constant Team::ListingSafe
# ./spec/models/team_spec.rb:55:in `block (3 levels) in <top (required)>'
как будто Rails сингуляризирует listing_saves
в listing_safe
Вот некоторые пользовательские инфлекторы, которые я пробовал (не все одновременно) (ни один из них не работает)
# config/initializers/inflections.rb
ActiveSupport::Inflector.inflections do |inflect|
inflect.plural 'saved_listing', 'saved_listings'
inflect.singular 'saved_listings', 'saved_listing'
inflect.plural 'listing_save', 'listing_saves'
inflect.singular 'listing_saves', 'listing_save'
inflect.singular 'listing_safes', 'listing_safe'
inflect.plural 'listing_safe', 'listing_safes'
inflect.irregular 'listing_save', 'listing_saves'
inflect.irregular 'saved_listing', 'saved_listings'
end
Что я могу делать дальше?
Примечание: я нашел этот похожий вопрос, но ответ, похоже, не решил мою проблему
Изменить Я следовал за ответом ниже, так что теперь у меня есть следующее в моем config/initializers/inflections.rb
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 'listing_save', 'listing_saves'
end
Когда я открываю консольный сеанс и запускаю "listing saves".singularize
Я получаю "list_save", как я надеюсь. Тем не менее, кажется, что по крайней мере часть моего приложения не получает его, мои тесты по-прежнему не проходят так же, как и раньше. (Клянусь, я перезагружаю свой сервер и spork перед тестированием / запуском приложения!).
Редактировать 2 Я написал несколько тестов на перегибы в моем приложении:
describe "inflection" do
it "should singularize listing_saves properly" do
"listing_saves".singularize.should == "listing_save"
end
it "should pluralize listing_save properly" do
"listing_save".pluralize.should == "listing_saves"
end
end
Теперь у меня есть ситуация, когда эти тесты проходят нормально, но другие тесты по-прежнему не проходят с той же ошибкой, что и раньше
NameError:
uninitialized constant User::ListingSafe
То же приложение, тот же экземпляр Spork, те же файлы загружены. Здесь происходит что-то странное!
1 ответ
Вам нужно определить неправильный перегиб:
# Test your inflections!
> "listing_save".pluralize
=> "listing_saves" # OK!
> "listing_saves".singularize
=> "listing_safe" # Ouch :(
# Make it smarter
ActiveSupport::Inflector.inflections { |i|
i.irregular 'listing_save', 'listing_saves'
}
# Test again
> "listing_saves".singularize
=> "listing_save" # Yay!
Рубиновые документы:
------------------------ ActiveSupport::Inflector::Inflections#irregular
irregular(singular, plural)
------------------------------------------------------------------------
Specifies a new irregular that applies to both pluralization and
singularization at the same time. This can only be used for
strings, not regular expressions. You simply pass the irregular in
singular and plural form.
Examples:
irregular 'octopus', 'octopi'
irregular 'person', 'people'
Редактировать:
Некоторое дальнейшее исследование - и похоже, что другие наткнулись на эту же проблему (перегибы не работают, как ожидалось, с ассоциациями). Таким образом, пока вы можете установить имя класса вручную:
has_many :listing_saves, :class_name => "ListingSave"
Кто-то еще с той же проблемой, и дополнительные настройки перегиба. Лично я бы пошел с :class_name
установка вместо этого, хотя:
Проблема с пользовательскими перегибами в Ruby on Rails 3.0.3