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