Rails - 在命名空间中生成Scaffold

时间:2016-01-01 23:56:29

标签: ruby-on-rails ruby ruby-on-rails-3 namespaces

我有一个早期项目,我试图在组织成为问题之前命名,遵循最清晰和最新的post我可以找到关于命名空间。

但它并没有像我希望的那样神奇地工作。如何在功能齐全的命名空间中生成Scaffold?我相信这是一个多元化与奇点的问题。

示例:

words
  languages
  definitions

users

生成:

rails g scaffold Words/Language name:string
rails g scaffold Words/Definition name:string
rails g scaffold Word name:string language:references definition:references user:references

完成上述操作后,word.language会有例外情况,但word.user却不存在

irb(main)> word = Word.find(1)
  Word Load (0.3ms)  SELECT  "words".* FROM "words" WHERE "words"."id" = ? LIMIT 1  [["id", 1]]
=> #<Word id: 1, name: "Hello", language_id: 1, definition_id: 1, user_id: 1>

irb(main)> word.user
  User Load (0.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
=> #<User id: 1, name: "admin">

irb(main)> word.language
NameError: uninitialized constant Word::Language

Rails会生成两个模型,word.rbwords.rb

应用程序/模型/ word.rb

class Word < ActiveRecord::Base
  belongs_to :language
  belongs_to :definition
  belongs_to :user
end

应用程序/模型/ words.rb

module Words
  def self.table_name_prefix
    'words_'
  end
end

如何使用命名空间生成的支架解决这个奇异与复数的问题?

1 个答案:

答案 0 :(得分:0)

第二次尝试

在链接指南中,建议将控制器放入多个命名空间,以允许视图的嵌套文件夹结构。然而,模型应保持单数,因此我的第二次尝试是在单数名称空间中首先生成model,然后scaffold_controller通过--model-name=传递奇异模型。

生成:

rails g model Word/Language name:string
rails g scaffold_controller Words/Language name:string --model-name=Word/Language

rails g model Word/Definition body:text
rails g scaffold_controller Words/Definition name:string --model-name=Word/Definition

rails g model Word name:string language:references definition:references user:references

rails g scaffold_controller Word name:string language:references definition:references --model-name=Word

有问题的路线:

namespace :words do
  resources :definitions, :languages
end
resources :words

这次错误是undefined local variable or method 'new_word_definition_path'

这是因为根据new_words_language,正确的路线为rake routes

这使我回到了如何克服这种多重混淆的初步问题。