【问题标题】:Rails - Model name ends with SRails - 模型名称以 S 结尾
【发布时间】:2012-08-13 04:52:57
【问题描述】:

我有一个名为ActiveDns 的模型。当我跑步时

rails g scaffold_controller ActiveDns

我收到消息

检测到的模型的复数版本,使用单数版本。用 --force-plural 覆盖。

现在,控制器和视图的生成假装单数是ActiveDn,复数是ActiveDns,我得到像link_to new_dn_path 这样的傻东西。 --force-plural 参数似乎无法解决此问题:

rails g scaffold_controller ActiveDns --force-plural

仍然导致控制器使用名为 @active_dn 的变量和使用 new_dn_path 的视图,使用 rails 3.2.3。我正在使用rails d scaffold_controller ActiveDns 在尝试之间删除文件。

这样做的正确方法是什么?

【问题讨论】:

  • 不用手动删除不正确的文件,你也可以rails destroy scaffold_controller ActiveDns

标签: ruby-on-rails scaffolding


【解决方案1】:

这样做的正确方法是什么?

我使用inflectionsdocument 不可数的实体。

config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable "ActiveDns"
end

然后你得到:

$ rails g scaffold_controller ActiveDns
      create  app/controllers/active_dns_controller.rb
      invoke  erb
      create    app/views/active_dns
      create    app/views/active_dns/index.html.erb
      create    app/views/active_dns/edit.html.erb
      create    app/views/active_dns/show.html.erb
      create    app/views/active_dns/new.html.erb
      create    app/views/active_dns/_form.html.erb
      invoke  test_unit
      create    test/functional/active_dns_controller_test.rb
      invoke  helper
      create    app/helpers/active_dns_helper.rb
      invoke    test_unit
      create      test/unit/helpers/active_dns_helper_test.rb

这是你想要的吗?

【讨论】:

    【解决方案2】:

    我用 rails-3.2 测试过(我猜它应该适用于 rails-3.x)

    打开你的config/initializers/inflections.rb 并添加一条规则:

    ActiveSupport::Inflector.inflections do |inflect|
      inflect.irregular 'dns', 'dnses'
    end
    

    并生成控制器

    rails g scaffold_controller ActiveDns
    

    并将路由添加到您的 config/routes.rb 文件

    resources :active_dnses
    

    然后你应该看到:

    $ rake routes
    
       active_dnses GET    /active_dnses(.:format)          active_dnses#index
                    POST   /active_dnses(.:format)          active_dnses#create
     new_active_dns GET    /active_dnses/new(.:format)      active_dnses#new
    edit_active_dns GET    /active_dnses/:id/edit(.:format) active_dnses#edit
         active_dns GET    /active_dnses/:id(.:format)      active_dnses#show
                    PUT    /active_dnses/:id(.:format)      active_dnses#update
                    DELETE /active_dnses/:id(.:format)      active_dnses#destroy
    

    【讨论】:

    • 使用 rails 4.2.1 对我来说效果很好
    • rails 5 下的“status”有同样的问题
    • 这个解决方案几乎对我有用,除了路由辅助方法。虽然rake routes 正确,但new_active_dns_path 方法不存在,只有new_active_dnses_path 存在,这很奇怪。 form_for(@active_dns) 方法也以错误的方式保持复数形式
    【解决方案3】:

    我想分享一下我是如何解决我的问题的。

    我在Data_Warehouse 下有一个名为Pacman 的MVC。

    Pacman 是专有名词。 (不能是Pacmene,但应该是Pacmanss

    Data_Warehouse 就像一个平台名称。 (可以是任何东西,在这种情况下是DataWarehouse::Pacman

    所以,我有

    型号名称 - models/data_warehouse/pacman.rb

    视图名称 - views/data_warehouse/pacmans/index.slim

    控制器名称 - controller/data_warehouse/pacmans_controller.rb

    问题是,Rails 读取这条路径

    data_warehouse_pacmans_path

    作为

    data_warehouse_pacmen_path

    因为复数。

    所以

    我通过添加解决了这个问题

    ActiveSupport::Inflector.inflections do |inflect|
       inflect.uncountable %w( pacmans )
    end
    

    到 Rails 中的 inflections.rb 文件。

    希望这会有所帮助

    【讨论】:

    • 欢迎来到本站。请使用仅与您提出的问题相关的详细信息编辑问题(避免在帖子中描述您的详细信息)。您可以随时使用编辑功能更新您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多