рельсы 3.1 проблема перегиба - PullRequest
3 голосов
/ 07 июля 2011

У меня есть приложение 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

Модель соединения выглядит следующим образом

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 Ответ

11 голосов
/ 07 июля 2011

Вам необходимо определить нерегулярный перегиб:

# 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'

Edit:

Некоторое дальнейшее исследование - и похоже, что другие тоже наткнулись на эту же проблему (перегибы не работают, как ожидалось, с ассоциациями). Таким образом, вы можете установить имя класса вручную:

has_many :listing_saves, :class_name => "ListingSave"

Кто-то еще с той же проблемой, и с некоторыми изменениями. Лично я бы вместо этого выбрал настройку :class_name:

Проблема с пользовательскими перегибами в Ruby on Rails 3.0.3

...