Ответ 1
rails generate model Portfolio
rails generate controller Admin::Portfolios
Генератор скаффолдов Rails 3 помещает классы моделей в пространство имен. Пример:
rails generate scaffold admin/portfolio
Но я хочу, чтобы внутри пространства имен администратора были размещены только контроллеры и представления.
Как я могу избежать этого?
rails generate model Portfolio
rails generate controller Admin::Portfolios
Генераторы 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
Это даст вам контроллер с пространством имен и представления, которые ссылаются на модель, отличную от имен.
@RubyDev был прав, предлагая Ryan Bate Nifty Generators, но я не знаю, почему он сказал использовать опцию -skip-model.
Nifty Generators действительно будут делать именно то, о чем вы просите. Просто добавьте его в свой Gemfile:
gem "nifty-generators"
и запустите:
rails g nifty:scaffold Admin::Portfolio name:string
Это создаст все нормальные эшафоты с контроллерами и представлениями в пространстве имен "admin", но модель не в пространстве имен.
Обновлено согласно @tybro0103
Использовать nifty: генераторы: https://github.com/ryanb/nifty-generators
rails generate nifty:scaffold Admin::Portfolio
Если вы уже создали модель или эшафот без пространства имен и хотели бы сделать это снова для пространства имен admin, вы можете пропустить модель:
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.
Nifty генераторы были правильные вещи некоторое время назад, но теперь, когда Rails 4 выпустила, он устарел. Если вы хотите создать административные леса с моделью, отличной от имен, вы можете использовать rails-admin-scaffold gem.
Вы можете просто создать свои собственные генераторы и делать с ними все, что хотите:
В Rails 4:
#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 (или, по крайней мере, на 5.1), используя следующую команду:
rails g scaffold_controller admin/portfolio --model-name=Portfolio
Указывая --model-name Rails автоматически не пытается угадать имя модели.
Лучшее решение
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
Таким образом, он не генерирует префикс в таблицах