我有一个早期项目,我试图在组织成为问题之前命名,遵循最清晰和最新的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.rb
和words.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
如何使用命名空间生成的支架解决这个奇异与复数的问题?
答案 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
。
这使我回到了如何克服这种多重混淆的初步问题。