Динамические контроллеры и представления rails без кода

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

Я только что создал модель SearchDescription с двумя полями, контроллером и представлением. Мне нужен шаблонный индекс по умолчанию, шоу и т. Д. Также rspecs, но опять же полностью по умолчанию. Ничего особенного. Просто по умолчанию.

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

Есть ли способ сделать это чище с меньшим количеством кода, фактически генерируемого в проекте, а скорее «динамически генерируемым»?

Например, просто напишите в конфигурационном файле следующее: SearchDescription, field1, field2; с контроллером; с видами; с rspecs

и работает ли это по соглашению без фактического создания файлов?


person kmitov    schedule 22.02.2015    source источник
comment
для этого есть много инструментов, но генерация шаблона — лучшая практика для рельсов. ruby-toolbox.com/categories/rails_controller_abstractions   -  person phoet    schedule 22.02.2015


Ответы (1)


Цель Rails — удобочитаемость, соглашения по настройке и демонстрация другим кода, который является самодокументированным. Хотя... Я проводил тестирование таким образом раньше, хотя в итоге мы использовали одни и те же функции и передавали их по файлам, которые в любом случае должны были быть там, чтобы все могли их прочитать.

Спецификация может выглядеть примерно так:

require 'spec_helper'

Инициализация 'config'-хэша, который мы можем легко читать и манипулировать:

objectHash = {  'controller' => 'ClassController', 
          'object' => 'Class',
          'engine' => 'Engine'
        }

hash = { "#{objectHash['engine']}::#{objectHash['object'].capitalize}" => objectHash }


hash.each do |key, values|

describe Object.const_get("#{values['engine']}::#{values['controller']}"), :type => :controller do
  login_user

  before :each do
    @object_string = "#{values['engine']}::#{values['object']}"
    @object = FactoryGirl.create(Object.const_get(@object_string))
    @example_attribute = :objectAttribute
  end

Это обычный рельсовый путь, только немного более абстрактный.

  context "GET 'index'" do
    it "should not be possible to access without permission" do
      get :index, { use_route: values['engine'].to_sym }
      expect(response).to have_http_status(302)
    end

    it "should be possible to access with permissions" do
      permission_string = "#{values['engine'].downcase}_#{values['object'].underscore.pluralize.downcase}_index"
      create_permissions(permission_string, false, true, subject.current_user)

      get :index, { use_route: values['engine'].to_sym }
      expect(response).to have_http_status(200)
    end
  end
end

и так далее...

Как вы можете себе представить, такой код действительно выходит за рамки принципов «легкости для понимания», которым мы все пытаемся следовать.

И в последний раз вы сказали, что пишете тесты для базовой функциональности? Есть ли вообще смысл тестировать вещь, о которой вы знаете, как она работает? Я точно не знаю, но похоже, что вы тестируете базовые рельсы.

person bastianwegge    schedule 22.02.2015
comment
Я хотел бы пройти тест на случай, если мне придется что-то изменить, и я хотел бы поймать потенциальные регрессии. - person kmitov; 30.03.2015