Генератор Rails scaffold_controller не применяет атрибуты модели к представлениям

Я использую генератор scaffold_controller в существующей модели с существующими атрибутами, но формы представления, которые генерируются, не имеют каких-либо элементов управления ввода для соответствующих атрибутов модели - это просто пустые формы. Почему это?

например:

rails generate scaffold_controller User --skip --no-test-framework

Если у пользователя уже есть атрибуты name и email, должны создавать формы с полями имени и электронной почты...

Ответ 1

Это то, что он должен делать. При вызове scaffold_controller вы говорите генератору, что не используете модель. Если вы хотите иметь атрибуты формы в представлениях, вам необходимо передать их генератору, как если бы вы были обычными лесами.

rails g scaffold_controller User name email

Ответ 2

Я согласен с тем, что это связано с необходимостью клавиатуры всех атрибутов самостоятельно, с опасностью ошибочного имени или типа, когда информация просто сидит там в модели. Вот патч обезьяны, который я написал, чтобы интерполировать имена и типы столбцов (по крайней мере, в Rails 4). Поместите этот код в файл .rb в каталоге # {Rails.root}/config/initializers:

# patch to scaffold_controller to read model attributes
# if none specified on command line (and model exists)
# usage: rails g scaffold_controller <MODEL>

if ARGV.size > 0 and ARGV[0] == "scaffold_controller"
    puts "\n\n\n\n"
    puts "monkey patch attributes at #{Time.now}"

    Rails::Generators::NamedBase.class_eval do

        # parse_attributes! converts name:type list into GeneratedAttribute array
        # must be protected; thor enumerates all public methods as commands
        # and as I found out will call this and crash otherwise
        protected
        def parse_attributes! #:nodoc:
          # get model columns into col:type format
          self.attributes = get_model_attributes if not self.attributes or self.attributes.empty?
          # copied from default in named_base.rb
          self.attributes = (self.attributes || []).map do |attr|
            Rails::Generators::GeneratedAttribute.parse(attr)
          end
        end

        # get model columns if no attributes specified on command line
        # fake it by creating name:type args
        private
        def get_model_attributes
            # fill from model
            begin
                mdl = class_name.to_s.constantize
                # don't edit id, foreign keys (*_id), timestamps (*_at)
                attrs = mdl.columns.reject do |a|
                    n = a.name
                    n == "id" or n.end_with? "_id" or n.end_with? "_at"
                end .map do |a|
                    # name:type just like command line
                    a.name+":"+a.cast_type.type.to_s
                end
                puts "model_attributes(#{class_name})=#{attrs}"
                return attrs
            rescue => ex
                puts ex
                puts "problem with model #{class_name}"
                return nil
            end
        end

    end

end

Ответ 3

В рейлах 5 вы можете получить список столбцов с типом, используя следующий код.

Model.columns.reject{|n| n.name == "id" or n.name == "created_at" or n.name == "updated_at" }.map{|i| "#{i.name}:#{i.type}"}.join(" ")

Позже вы можете вставить выходные рельсы поста Модель scaffold_controller