我需要在我的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)
插入多个行,每个行具有相同的用户名但属性名称和值不同。完美。
我的问题是,我如何使用单一表格?最初我有一个父模型和一个嵌套形式,但我无法弄明白。
答案 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
且Attribute
有attribute_name
,value
和user_id
。
然后您的表单,使用haml,simple_form和cocoon看起来像
= 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?
不存在,这只是提供一个小例子。在此验证方法中,您将添加所有可能的属性值组合及其验证。
希望这有帮助。