使用单个表单Rails3多次插入值

时间:2011-11-25 17:11:50

标签: ruby-on-rails ruby-on-rails-3 activerecord

我需要在我的rails3应用程序中创建一个表单,在保存后,它将验证字段然后提交它们。我基本上需要为每个字段添加一行。

原因是每个'用户'都有多个属性。例如:

  • 用户密码
  • 过期
  • 接入组

尝试过嵌套表格,但这对我来说并不适用。

在我的控制台中,这对我很有用:

user = Array.new
user << {:username => "jenny", :attribute_name => "User-Password", :value => "123"}
user << {:username => "jenny", :attribute_name => "Expiration", :value => "123"}
user << {:username => "jenny", :attribute_name => "Access-Group", :value => "123"}
User.create(user)

插入多个行,每个行具有相同的用户名但属性名称和值不同。完美。

我的问题是,我如何使用单一表格?最初我有一个父模型和一个嵌套形式,但我无法弄明白。

1 个答案:

答案 0 :(得分:1)

这实际上应该是非常简单的嵌套表单。我们假设

class User
  has_many :attributes
  accepts_nested_attributes_for :attributes, :reject_if => :all_blank, :allow_destroy => true
end

class Attribute
  belongs_to :user
end

Attributeattribute_namevalueuser_id

然后您的表单,使用haml,simple_formcocoon看起来像

= simple_form_for @user do
  = f.input :name
  #attributes
    = f.simple_fields_for :attributes do |attribute|
      = render 'attribute_fields', :f => attribute
    .links
      = link_to_add_association 'add new attribute', f, :attributes

并添加一个名为_attribute_fields.html.haml

的部分
.nested-fields
  = f.input :attribute_name
  = f.input :value
  = link_to_remove_association "remove attribute", f

如果属性已修复,您可以轻松地将attribute_name的输入更改为

= f.input :attribute_name, :as => :select, :collection => {'User-Password', 'Expiration', 'Access-Group' }

如果您想了解有关不同类型的嵌套表单的更多信息,我已经更详细地撰写了blogpost

[编辑]将服务器端验证添加到Attribute模型:

在课程Attribute内,您需要添加:

validate :check_valid_values

def check_valid_values
  if attribute_name == 'Expiration'
    errors.add(:value, "Must be a valid date for Expiration") unless value.is_a_valid_date?
  end
end

请注意,方法is_a_valid_date?不存在,这只是提供一个小例子。在此验证方法中,您将添加所有可能的属性值组合及其验证。

希望这有帮助。