Dav*_*ite 3 ruby-on-rails inflection activesupport ruby-on-rails-3 ruby-on-rails-3.1
我有一个带有以下2个型号的Rails 3.1应用程序
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
Run Code Online (Sandbox Code Playgroud)
Join模型看起来像这样
class ListingSave < ActiveRecord::Base
belongs_to :team
belongs_to :listing
end
Run Code Online (Sandbox Code Playgroud)
Mow我认为存在一个变形问题,因为每当我尝试运行我的测试时,我都会收到以下错误(这是一个错误示例和导致它的测试)
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)>'
Run Code Online (Sandbox Code Playgroud)
仿佛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
Run Code Online (Sandbox Code Playgroud)
我接下来该怎么办?
注意:我发现了这个类似的问题,但答案似乎并没有解决我的问题
编辑
我按照下面的答案,以便我现在在我的config/initializers/inflections.rb
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 'listing_save', 'listing_saves'
end
Run Code Online (Sandbox Code Playgroud)
当我打开一个控制台会话并运行时"listing saves".singularize,我希望得到"listing_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
Run Code Online (Sandbox Code Playgroud)
现在我有一种情况,这些测试通过正常,但其他测试仍然失败,我遇到了同样的错误
NameError:
uninitialized constant User::ListingSafe
Run Code Online (Sandbox Code Playgroud)
相同的应用程序,相同的spork实例,加载相同的文件.奇怪的事发生在这里!??
Cas*_*per 11
你需要定义一个不规则的变形:
# 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!
Run Code Online (Sandbox Code Playgroud)
Ruby文档:
------------------------ 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'
Run Code Online (Sandbox Code Playgroud)
编辑:
一些进一步的调查 - 看起来其他人也偶然发现了同样的问题(变形与协会没有预期的效果).因此,在此期间您可以手动设置类名:
has_many :listing_saves, :class_name => "ListingSave"
Run Code Online (Sandbox Code Playgroud)
其他人有同样的问题,并有额外的变形调整.我个人而言,我会:class_name改用这个设置:
| 归档时间: |
|
| 查看次数: |
3921 次 |
| 最近记录: |