Как избежать скаффолдов Rails для размещения модели в пространстве имен - PullRequest
28 голосов
/ 24 сентября 2010

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

rails generate scaffold admin/portfolio

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

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

С уважением, Алексей Захаров.

Ответы [ 8 ]

33 голосов
/ 22 августа 2015

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

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

23 голосов
/ 24 сентября 2010

rails generate model Portfolio

rails generate controller Admin::Portfolios

7 голосов
/ 12 июля 2012

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

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

gem "nifty-generators"

и запустите:

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

Это создаст все, что будет делать обычный скаффолд с контроллерами и представлениями в пространстве имен «admin», номодель не в пространстве имен.

5 голосов
/ 18 сентября 2011

Обновлено согласно @ tybro0103

Использовать nifty: generators: 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.

1 голос
/ 13 ноября 2017

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

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

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

1 голос
/ 25 ноября 2013

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

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

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

1 голос
/ 25 августа 2013

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

0 голосов
/ 26 апреля 2017

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

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

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

...