Подтвердить что ты не робот

Как избежать эстакады Rails для размещения модели в пространстве имен

Генератор скаффолдов Rails 3 помещает классы моделей в пространство имен. Пример:

rails generate scaffold admin/portfolio

Но я хочу, чтобы внутри пространства имен администратора были размещены только контроллеры и представления.

Как я могу избежать этого?

4b9b3361

Ответ 1

rails generate model Portfolio

rails generate controller Admin::Portfolios

Ответ 2

Генераторы 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

Это даст вам контроллер с пространством имен и представления, которые ссылаются на модель, отличную от имен.

Ответ 3

@RubyDev был прав, предлагая Ryan Bate Nifty Generators, но я не знаю, почему он сказал использовать опцию -skip-model.

Nifty Generators действительно будут делать именно то, о чем вы просите. Просто добавьте его в свой Gemfile:

gem "nifty-generators"

и запустите:

rails g nifty:scaffold Admin::Portfolio name:string

Это создаст все нормальные эшафоты с контроллерами и представлениями в пространстве имен "admin", но модель не в пространстве имен.

Ответ 4

Обновлено согласно @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.

Ответ 5

Nifty генераторы были правильные вещи некоторое время назад, но теперь, когда Rails 4 выпустила, он устарел. Если вы хотите создать административные леса с моделью, отличной от имен, вы можете использовать rails-admin-scaffold gem.

Ответ 6

Вы можете просто создать свои собственные генераторы и делать с ними все, что хотите:

В 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'

К сожалению, это относится только к контроллеру. Я все еще ищу решение для просмотра.

Ответ 7

Вы можете сделать это сейчас на Rails (или, по крайней мере, на 5.1), используя следующую команду:

rails g scaffold_controller admin/portfolio --model-name=Portfolio

Указывая --model-name Rails автоматически не пытается угадать имя модели.

Ответ 8

Лучшее решение

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

Таким образом, он не генерирует префикс в таблицах