【问题标题】:RoR 3 Creating an Invoice app - How do I create the form for a HABTM invoice/products association?RoR 3 创建发票应用程序 - 如何为 HABTM 发票/产品关联创建表单?
【发布时间】:2011-10-21 03:13:32
【问题描述】:

我正在尝试开具发票申请。以下是与我的问题相关的模型:

更新:由于最近的建议,模型信息已更改

Invoice  
> id  
> created_at  
> sales_person_id

LineItem
> id  
> invoice_id  
> item_id  
> qty_commit (inventory only)  
> qty_sold  
> price (because prices change)  
> ...etc

Item
> barcode  
> name  
> price
> ...etc

发票has_many items, :through => :line_items。项目同上。我想要做的是,当我创建新发票时,我希望表单中包含所有可用项目。我不希望填充所有项目的唯一时间是在查看发票时(因此只应检索 LineItems 表中存在的项目)。目前 - 显然 - 新发票没有项目。当集合中当前没有任何内容时,如何将它们列出,以及如何填充表单?我还希望在创建失败时所有产品都可用(以及用户通过表单选择的产品)。

更新:我可以通过控制器通过以下方式创建项目:

@invoice = Invoice.new
# 使用所有产品填充发票,以便可以选择它们
Item.where("stock > ?", 0).each do |i|
@invoice.items.new(i.attributes)
结束

这当然是我做我想做的事情的粗略尝试。从视觉上看效果很好,但正如预测的那样,当我实际尝试保存模型时,我的表单 ID 等并不能很好地发挥作用。

需要 LineItem(#37338684),得到 Array(#2250012)

表格示例:

# f 是 form_for







p.tax_included %>

$



【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 forms has-and-belongs-to-many


    【解决方案1】:

    首先,如果您明确希望有一个带有附加属性的连接模型,您应该使用has_many :through 而不是has_and_belongs_to_many。查看两者中的RoR Guide to the differences

    其次,对于您想要达到的目标,没有单一的解决方案。我看到有两种典型用法,具体取决于可能实例的数量,一种优于另一种:

    1. 使用单选按钮选择(和取消选择)应在何处创建或删除关系。请参阅 railscast #165 如何完成其​​中的一部分。
    2. 您可以使用带有按钮的选择菜单来添加关系。见railscast #88。添加的关系可以显示在列表中,旁边有一个删除按钮。
    3. 使用令牌字段(请参阅railscast #258)在一个文本输入字段中自动完成多个条目。

    在所有情况下,您通常必须在最后检查,如果

    • 应删除关系
    • 保留
    • 或创建

    我希望其中的一些想法可以为您的问题提供正确的解决方案。


    【讨论】:

    • 我目前设置了控制器,以便从 items 表中检索所有产品。视图利用了这一点,但表单输入的 id 是唯一的,因此一旦点击提交按钮,它就不会被视为 Invoice 模型的一部分。如何创建每个表单元素的 id,以便在我打算保存模型时不必通过控制器做任何额外的工作?
    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2014-02-28
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多