我正在创建一个自定义控制器生成器,它派生自Rails:Generators:NamedBase,它在给定特定模型名称(例如Person)的情况下创建控制器和视图。我还想创建一个_form.html.haml分部,它基于模型的属性构建表单(我使用的是simple_form-btw)。
到目前为止,我拥有的是:
<% attributes = file_name.capitalize.constantize.columns.map { |c| [Rails::Generator::GeneratedAttribute.new(c.name, c.type)]} %>
- simple_form_for [:admin,@<%=file_name%>] do |f|
= render 'shared/error_summary', :object => f.object
.inputs
<%- attributes.each do |attribute| -%>
= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %>
<%- end -%>
.actions
= f.button :submit
我得到一个"未初始化的常量Rails:Generator(NameError)"异常。不确定我需要什么,或者我上面的方法是否正确。
任何帮助都会很棒。
谢谢-wg
我怀疑问题在于Generator后面缺少一个s。正确的方法调用是:
Rails::Generators::GeneratedAttribute.new
与其在模板中创建属性变量,不如在initialize方法中的生成器类中创建它。这个方法看起来像一个骨架:
def initialize(*args, &block)
super
# Call Rails::Generators::GeneratedAttribute.new here
end
如果要让用户以column_name:column_type的形式传入所需的属性,则可以执行以下操作:
class FooGenerator < Rails::Generators::NamedBase
argument :model_attributes, type: :array, default: [], banner: "model:attributes"
def initialize(*args, &block)
super
@attributes = []
model_attributes.each do |attribute|
@attributes << Rails::Generators::GeneratedAttribute.new(*attribute.split(":")) if attribute.include?(":")
end
end
end
您可能还想处理没有属性以某种方式传入的可能性。然而,这将取决于您的需求,因此如果没有更多信息,我无法指导您。很抱歉
要遵循的一个好的模型标准是nifty_generators源代码。