2011-06-08 124 views
3

我正在創建一個自定義控制器生成器,該生成器從Rails :: Generators :: NamedBase派生,該控制器生成控制器和給定特定模型名稱(例如Person)的視圖。我也想創建一個_form.html.haml部分,它根據模型的屬性構建一個表單(我使用simple_form btw)。如何獲取自定義控制器生成器中的GeneratedAttribute?

我至今是:

<% 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 ::發生器(NameError)」 異常。不知道我需要什麼或者我的方法是否正確。

任何幫助都會很棒。

謝謝-wg

回答

4

我懷疑問題是你在發生器後遺漏了一個s。正確的方法調用:

Rails::Generators::GeneratedAttribute.new 

而不是創建您的屬性變量模板裏面的,最好是建立在它的初始化方法的生成器類中。這種方法看起來像這樣爲骨架:

def initialize(*args, &block) 
    super 

    # Call Rails::Generators::GeneratedAttribute.new here 

    end 

如果你讓你的用戶在表單列名所需的屬性來傳遞: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

相關問題