0

我一直在寻找类似的问题,但我仍然不明白如何实现这种关系。我当然有三个模型:

class Recetum < ActiveRecord::Base
    attr_accessible :name, :desc, :duration, :prep, :photo, :topic_id
    has_many :manifests
    has_many :ingredients, :through => :manifests
end

class Ingredient < ActiveRecord::Base
  attr_accessible :kcal, :name, :use, :unity
  has_many :manifests
  has_many :recetum, :through => :manifests
end


class Manifest < ActiveRecord::Base
  attr_accessible :ingredient_id, :quantity, :receta_id
  belongs_to :recetum
  accepts_nested_attributes_for :ingredient
  belongs_to :ingredient
end

直肠将是一个配方(脚手架时的拼写错误),这个配方可能有一种或多种成分(已经在数据库上)。因此,当我创建一个新的直肠时,我需要创建新的直肠,并在清单中为用户输入的每种成分插入一条记录。

我现在需要一些关于视图和控制器的帮助,我如何创建带有成分字段的直肠表单,更重要的是我必须修改直肠控制器。

任何建议或帮助将不胜感激,因为这部分对我的项目至关重要,在此先感谢。

4

1 回答 1

0

你有几个选项,主要取决于你想在你的视图中做什么。你想显示一组数量max_ingredients还是你希望它是完全动态的?动态案例肯定对用户来说看起来更好,但它确实会产生一些更复杂的代码。

这是一个很好的 RailsCast,它解释了如何通过 JavaScript 动态地做到这一点:

http://railscasts.com/episodes/74-complex-forms-part-2

不幸的是,并不是每个人都在启用 JavaScript 的情况下运行,因此您可能需要考虑以静态方式进行。

accepts_nested_attributes_for首先,我认为您的模型不需要Manifest。但是,我确实认为您的Recetum模型中需要它。如果您要使用静态路由,您可能还需要设置一个reject_if选项。

accepts_nested_attributes_for :manifests, reject_if: :all_blank

完成此操作后,您需要添加manifests_attributes到您的attr_accessible.

使用静态路由,您需要预先构建一些manifests. 在你的new控制器中,你会想要这样的东西:

max_ingredients.times do
  @recetum.manifests.build
end

在你的和你的edit和的错误路径中createupdate你可能想要:

(max_ingredients - @recetum.manifests.count).times do
  @recetum.manifests.build
end

最后,您的视图将需要一些方法来设置成分。我现在假设一个选择框。

f.fields_for :manifests do |mf|
  mf.label :ingredient_id, "Ingredient"
  mf.collection_select :ingredient_id, Ingredient.all, :id, :name

您可能希望通过列表或表格添加某种格式。

希望这足以让您入门。

于 2013-01-14T16:52:01.633 回答