简体   繁体   English

rails 3.1 拐点问题

[英]rails 3.1 inflection problem

I have a Rails 3.1 app with the following 2 models我有一个带有以下 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

The Join model looks like this Join model 看起来像这样

class ListingSave < ActiveRecord::Base
  belongs_to :team
  belongs_to :listing
end

Mow I think that there is an inflection problem because whenever I try to run my tests I get the following error (this is an example of an error and the test that caused it) 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)>'

as if Rails is singularizing listing_saves into listing_safe好像 Rails 正在将listing_safe单数化为listing_saves

Here are some custom inflectors I have tried (not all at the same time) (none of them work)这是我尝试过的一些自定义变形器(不是同时尝试的)(它们都不起作用)

# 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

What can I do next?接下来我能做什么?

Note: I found the this similar question but the answer doesn't seem to solve my problem注意:我发现了这个类似的问题,但答案似乎没有解决我的问题

Edit I followed the answer below so that I now have the following in my config/initializers/inflections.rb编辑我遵循下面的答案,所以我现在在我的config/initializers/inflections.rb中有以下内容

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'listing_save', 'listing_saves'
end

When I open up a console session and run "listing saves".singularize I get "listing_save" as I would hope.当我打开控制台 session 并运行"listing saves".singularize我希望得到“listing_save”。 However, it seems that at least part of my application doesn't get it, my tests still fail in the same way as before.但是,似乎我的应用程序至少有一部分没有得到它,我的测试仍然像以前一样失败。 (I swear I'm restarting my server and spork before I test/run the application.). (我发誓在测试/运行应用程序之前我会重新启动我的服务器和 spork。)。

Edit 2 I wrote some tests for inflections in my app:编辑 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

Now I have a situation where these tests pass fine, but other tests still fail with the same error I was having before现在我遇到了这些测试通过正常的情况,但其他测试仍然失败,并出现与我之前相同的错误

NameError:
       uninitialized constant User::ListingSafe

Same app, same spork instance, same files loaded.相同的应用程序,相同的 spork 实例,加载相同的文件。 Something weird is going on here???这里发生了什么奇怪的事情???

You need to define an irregular inflection:您需要定义一个不规则拐点:

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

Ruby docs: 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'

Edit:编辑:

Some further investigation - and it looks like others have stumbled upon this same problem also (inflections not working as expected with associations).一些进一步的调查 - 看起来其他人也偶然发现了同样的问题(变形与关联没有按预期工作)。 So in the meantime you can set the class name manually:因此,与此同时,您可以手动设置 class 名称:

has_many :listing_saves, :class_name => "ListingSave"

Someone else with the same problem, and an additional inflections tweak.其他人有同样的问题,并进行了额外的屈折调整。 Personally I'd go with the :class_name setting instead though:我个人会使用:class_name设置来代替 go :

Issue with custom inflections in Ruby on Rails 3.0.3 Rails 3.0.3 上 Ruby 中的自定义变形问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM