Formtastic的未定义方法`has_many'

时间:2012-04-09 08:36:17

标签: ruby-on-rails-3 activeadmin formtastic

我收到了这个错误:

undefined method `has_many' for #<Formtastic::SemanticFormBuilder:0xb410d4c>

当我像这样使用它时它起作用:

ActiveAdmin.register Ressource do
    form do |f|  
        f.inputs do
            f.input :offer_id, :as => :hidden
            f.input :name
            f.input :category, :include_blank => false, :collection => Category.order('place ASC').all, :member_label => :to_label
            f.input :description, :input_html => {:class => 'editor'}
            f.input :price
        end
        f.has_many :roles do |app_f|
            app_f.inputs do
                if not app_f.object.id.nil?
                    app_f.input :_destroy, :as => :boolean, :label => "Supprimer l'utilisateur du lot"
                end
                app_f.input :user, :member_label => :to_label, :label => 'Assigné le lot'
                app_f.input :name, :include_blank => false
            end
        end
        f.buttons
    end
end 

但它不能部分工作,我需要通过不同的方式或其他方式调用has_many方法?

2 个答案:

答案 0 :(得分:14)

ActiveAdmin通过一些有用的帮助程序扩展了formtastic,例如activeadmin gem中的has_manylib/active_admin/form_builder.rb)。

不幸的是,默认情况下,这些帮助程序在模板中不可用。

以下是两个选项:

  1. 如果您不需要额外的has_many功能(看起来像active_admin添加了一些javascript以便于将新记录添加到集合中),那么您可以使用stock formtastic。此示例应在activeadmin文件以及部分文件中正常工作:

    ActiveAdmin.register Ressource do
      form do |f|  
        # ...
        f.inputs :for => :roles do |app_f|
          # ...
          app_f.input :name, :include_blank => false
        end
        f.buttons
      end
    end 
    
  2. 明确使用ActiveAdmin表单构建器:

    <%= semantic_form_for [:admin, @resource], builder: ActiveAdmin::FormBuilder do |f| %>
      <!-- ... -->
    
      <%= f.has_many :teachers do |app_f| %>
        <%= app_f.inputs do %>
          <!-- ... -->
        <% end %>
      <% end %>
    
      <%= f.buttons %>
    <% end %>
    
  3. 我希望这会有所帮助。

答案 1 :(得分:3)

有一个解决方案

form :html => {:multipart => true} do |f|
end

或者,如果你想使用partial:

<%= active_admin_form_for [:admin, @resource] ,:html => {:multipart => true} do |f|%>
<% end %>