Rails 3的脚手架生成器将模型类放置在命名空间内。 例如:
rails generate scaffold admin/portfolio
但我希望只有控制器和视图能够放置在 admin 命名空间中。
我该怎么避免这种情况?
Rails 3的脚手架生成器将模型类放置在命名空间内。 例如:
rails generate scaffold admin/portfolio
但我希望只有控制器和视图能够放置在 admin 命名空间中。
我该怎么避免这种情况?
Rails 4 生成器有一些不同。如果使用 scaffold_controller 生成器,它将预先构建所有视图文件,但默认情况下它将查找名为 Admin::Portfolio 的模型。要加载正确的模型,只需将模型名称作为参数传递给生成器即可。
$ rails g model Portfolio
invoke active_record
create db/migrate/20150822164921_create_portfolios.rb
create app/models/portfolio.rb
invoke test_unit
create test/models/portfolio_test.rb
create test/fixtures/portfolios.yml
$ rails g scaffold_controller Admin::Portfolio --model-name=Portfolio
create app/controllers/admin/portfolios_controller.rb
invoke haml
create app/views/admin/portfolios
create app/views/admin/portfolios/index.html.haml
create app/views/admin/portfolios/edit.html.haml
create app/views/admin/portfolios/show.html.haml
create app/views/admin/portfolios/new.html.haml
create app/views/admin/portfolios/_form.html.haml
invoke test_unit
create test/controllers/admin/portfolios_controller_test.rb
invoke helper
create app/helpers/admin/portfolios_helper.rb
invoke test_unit
invoke jbuilder
create app/views/admin/portfolios
create app/views/admin/portfolios/index.json.jbuilder
create app/views/admin/portfolios/show.json.jbuilder
这将为您提供一个带有命名空间的控制器和视图,这些控制器和视图引用非命名空间模型。rails generate model Portfolio
rails generate controller Admin::Portfolios
@RubyDev建议使用Ryan Bate的Nifty Generators是正确的,但我不知道他为什么说要使用--skip-model选项。
Nifty Generators实际上会完全做你所要求的事情。只需将其添加到您的Gemfile中:
gem "nifty-generators"
并运行:
rails g nifty:scaffold Admin::Portfolio name:string
@tybro0103提供了更新内容
使用nifty:生成器:https://github.com/ryanb/nifty-generators
rails generate nifty:scaffold Admin::Portfolio
rails generate nifty:scaffold Admin::Portfolio --skip-model
rails generate nifty:scaffold portfolio name:string
rails generate nifty:scaffold Admin::portfolio name:string --skip-model
我通常会将它们一起执行,这样只需转到上一个命令并进行编辑以添加Admin::和--skip-model。
rails g scaffold_controller admin/portfolio --model-name=Portfolio
portfolios_path
而不是admin_portifolios_path
)。 - Jonas Porto#config/application.rb
config.generators do |g|
g.scaffold_controller :my_controller
end
并且
#lib/generators/rails/my_controller/my_controller_generator.rb
class Rails::MyControllerGenerator < Rails::Generators::ScaffoldControllerGenerator
def class_name
([file_name]).map!{ |m| m.camelize }.join('::')
end
def table_name
@table_name ||= begin
base = pluralize_table_names? ? plural_name : singular_name
([base]).join('_')
end
end
end
将模型命名空间去除。
请注意,如果您正在单独生成一个scaffold_controller,则需要显式调用自定义生成器:rails g my_controller 'account/users'
不幸的是,这只处理了控制器。我仍在寻找视图解决方案。
最佳解决方案
rails generate scaffold admin/theme name:string active:integer position:integer --migration=false
rails generate migration CreateTheme name:string active:integer position:integer
# add t.timestamps in migration
因此它不会在表中生成前缀
rails g scaffold_controller
,它将显示该生成器的所有选项。 - Ryenskirails g scaffold admin/portfolio
应用目录级命名空间admin/
,Ruby 命名空间为Admin::Portfolio
,并生成名为admin_portfolio
的表,而上面的命令 (rails g scaffold Admin::Portfolio --model-name=Portfolio
) 生成相同的目录和文件,但内容不同,因为模型没有以admin_
为前缀,尽管模型仍然被命名空间化为Admin::Portfolio
。 - aksredirect_to @portfolio
改为redirect_to [:admin, @portfolio]
。 - phillyslick