【问题标题】:How to get at GeneratedAttribute in a custom controller generator?如何在自定义控制器生成器中获取 GeneratedAttribute?
【发布时间】:2011-06-08 21:09:39
【问题描述】:

我正在创建一个从 Rails::Generators::NamedBase 派生的自定义控制器生成器,它在给定特定模型名称(例如 Person)的情况下创建控制器和视图。我还想创建一个基于模型属性构建表单的 _form.html.haml 部分(顺便说一句,我使用的是 simple_form)。

到目前为止我所拥有的是:

<% 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

【问题讨论】:

    标签: ruby-on-rails-3 generator


    【解决方案1】:

    我怀疑问题是您在生成器之后缺少 s。正确的方法调用是:

    Rails::Generators::GeneratedAttribute.new
    

    与其在模板中创建属性变量,不如在生成器类中的初始化方法中创建它。这个方法看起来像这样的骨架:

      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 source 是一个很好的模型标准。

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多