0

关于如何在 ActiveAdmin 中使用 formtastic 创建深度嵌套的表单,我已经有一段时间了。这是我的模型结构的示例:

class Herb < ActiveRecord::Base
has_one :medicinal
attr_accessible :medicinal_attributes
accepts_nested_attributes_for :medicinal

一种药草有一种药用(使用)

class Medicinal < ActiveRecord::Base
attr_accessible :recipe_attributes
belongs_to :herb
has_and_belongs_to_many :recipes
accepts_nested_attributes_for :recipes

一个药用(用途)可以有很多配方

class Recipe < ActiveRecord::Base
has_and_belongs_to_many :medicinals
has_many :recipe_ingredients
has_many :ingredients, :through => :recipe_ingredients
attr_accessible :recipe_ingredients_attributes
accepts_nested_attributes_for :recipe_ingredients

一个食谱可以有很多成分(通过recipe_ingredients)

class RecipeIngredient < ActiveRecord::Base
attr_accessible :ingredient_attributes
belongs_to :recipe
belongs_to :ingredient

成分

class Ingredient < ActiveRecord::Base
    attr_accessible :item
has_many :recipes, :through => :recipe_ingredients 

所以这是我的问题。我希望用户能够从 ActiveAdmin 中的 Herb Entry 页面创建配方,能够将 Herb 自动输入为成分,并且如果用户输入当前不存在的成分,则将其作为新成分输入(因此其他食谱可以使用它)。我认为我不太了解如何在 ActiveAdmin 中使用控制器来知道从哪里开始......这是我到目前为止所拥有的:

ActiveAdmin.register Herb do

controller do
 def new
  @herb = Herb.new
  @herb.build_medicinal
 end
 def edit
  @herb = Herb.find(params[:id])
  if @herb.medicinal.blank?
    @herb.build_medicinal  
  end
 end
end

  form do |f|
   f.inputs "Herb" do
   f.inputs :name => "Medicinal", :for => :medicinal do |med| 
    med.input :content,  :label => "Medicinal Uses", :required => true
     med.has_many :recipes do |r|
      r.inputs "Recipe" do
       r.has_many :recipe_ingredients do |i|
        i.inputs "Ingredients" do
          i.input :ingredient
        end
       end
      end
     end
    end 
   end
  f.actions
  end

我知道这很长,但是您能给我的任何建议将不胜感激。我对rails比较陌生。谢谢!

4

1 回答 1

0

如果我正在构建同一个站点,我可能会稍微移动文件的结构以获得您正在寻找的结果。

应用程序/管理员/herb.rb

ActiveAdmin.register Herb do
end

这应该是您在 active_admin 中创建页面所需的全部内容。然后为您的 app/controller/herb_controller.rb

class HerbController < ApplicationController
 def new 
  @herb = Herb.new
 end 
end   

我现在要检查以验证您是否可以转到 ActiveAdmin 并创建一个新药草。我会进一步添加到您的 app/controller/herb_controller.rb 以检查在您创建草药时是否需要添加新成分。

...
def create
 @herb = Herb.new
 if @herb.save
  @herb.create_ingredient_if_not_existing
  # perform any other actions, such as flash message or redirect 
 else
  # perform action if save not successful
 end
end

现在你想在你的 Herb 模型中创建方法

def create_if_not_existing
 unless Ingredient.where("name = ?", self.name) then
  new_ingredient = ingredient.build
  new_ingredient.name = self.name
  # add extra attributes here if necessary
  new_ingredient.save
 end
end

然后,您可以确保您没有在任何一个模型中创建重复项,其中包含类似于以下的行:

validates :name, :uniqueness => true

这是我在 Stack Overflow 上的第一个答案,如果这对您有任何帮助,请告诉我!不久前我在同样的事情上苦苦挣扎,很幸运有几个人一路帮助我。

于 2013-04-04T21:11:41.530 回答