Rails 3嵌套表单,选择框只有一组字段

时间:2012-08-24 18:20:09

标签: ruby ruby-on-rails-3 nested-forms drop-down-menu

这是我第一次发帖,所以请告诉我是否有任何需要补充的内容。我有一个Event资源和一个嵌套的Item资源(该函数允许一个事件的访客带来项目)。

我在事件编辑视图中有一个嵌套的项目更新表单,允许您从下拉选择框中选择一个项目,然后从另一个选择框中选择一个数量来更新所需的项目数量。这是下面的form_for:

= form_for @event do |f|
    = f.fields_for :items do |i|
        %p
        = i.select(:name, options_for_select(@event.items.map {|p| p.name}))
        = i.select(:quantity, (1..5))
    = f.submit

我的问题是因为:项目是复数,当我只想要一个“项目名称”选择框和一个“项目数量”选择框时,我得到与该事件关联的每个项目的选择框。

当我将表单更改为:item时,我得到了我想要的视图,但是当我点击“更新事件”按钮时,我收到了“item”的未知属性错误。

请告诉我其他信息可能有助于解决此问题。我觉得这应该很简单,而且我已经搜索了很多。也许我的搜索词组合并不理想。

非常感谢。

修改

这是我的事件更新操作:

def update
    @event = Event.find(params[:id])

    if @event.update_attributes(params[:event])
        redirect_to :back
        flash[:notice] = "Items Updated!"
    else
        redirect_to :back
    end
end

编辑2

仅包含相关部分的事件和项目模型:

class Event < ActiveRecord::Base
 attr_accessible :items_attributes, :item_attributes, :name, :item 
 has_many :items
 accepts_nested_attributes_for :items
end

class Item < ActiveRecord::Base
 attr_accessible :name, :quantity, :event_id
 belongs_to :event
end

编辑事件控制器的操作(仅限相关部分):

    def edit
     @event = Event.find(params[:id])
     @item = @event.items.build
     unauthorized! if cannot? :update, @event
    end

1 个答案:

答案 0 :(得分:0)

在您的修改操作中,您的变量名称为@item,但在您的表单中为:items。您还在事件模型中有一个名为item的字段。因此,在您的表单中,它应该是:item而不是:items。

但这仍然会与Events模型中的item字段冲突。因此,要解决此问题,请将编辑操作中的项变量重命名为my_items,并在表单中使用相同的变量。

调用items是一个坏主意,因为rails会将其与@event的项目对象混淆,从而给您带来不受欢迎的结果。