ruby-on-rails - guide - rails scaffold references
El generador de Rails scaffold_controller no aplica los atributos del modelo a las vistas (2)
Esto es lo que se supone que debe hacer. Cuando llama a scaffold_controller
le está diciendo al generador que no use un modelo. Si desea tener atributos de formulario en las vistas, debe pasarlos al generador como lo haría con un andamio normal.
rails g scaffold_controller User name email
Estoy usando el generador scaffold_controller en un modelo existente con atributos existentes, pero los formularios de vista que se generan no tienen ningún control de entrada para los atributos del modelo correspondiente, solo son formularios vacíos. ¿Porqué es eso?
p.ej:
rails generate scaffold_controller User --skip --no-test-framework
Donde el usuario ya tiene name
y email
atributos de email
deben generar formularios con los campos de nombre y correo electrónico ...
Estoy de acuerdo en que apesta tener que teclear todos los atributos usted mismo, con el peligro de escribir mal el nombre o el tipo, cuando la información solo está allí en el modelo. Aquí hay un parche de mono que escribí para interpolar los nombres y tipos de columna (al menos en Rails 4). Coloque este código en un archivo .rb en el directorio # {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