如果验证失败,则hstore清空字段

时间:2015-06-02 05:47:46

标签: ruby-on-rails postgresql hstore

Rails 4.2 PostgreSQL 9.3.7

我正在使用hstore以键值格式存储一些数据。

create_table "lang", force: :cascade do |t|
  t.string   "name"
  t.hstore   "dictionary"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

在模型中,我通过store_accessor

使用一些验证
store_accessor :dictionary, :foo, :bar
validates_presence_of :foo, :bar

new格式的slim操作视图的一部分:

= form_for(@lang) do |f|
  .field
    = f.label :name
    = f.text_field :name
  .field
    = f.fields_for :dictionary do |dic_form|
      fieldset
        = dic_form.label :foo
        = dic_form.text_field :foo
        br
        = dic_form.label :bar
        = dic_form.text_field :bar
  .actions = f.submit

为什么验证检查失败时我输入的所有数据都被清空了? 例如:我在test字段中仅输入foo文字,提交表单。请参阅错误说明,但test字段中的foo文字已消失。

有没有办法让数据在普通的rails表单之间保持不变?

1 个答案:

答案 0 :(得分:0)

问题在于rails如何形成提取属性。 当我输入

= form_for(@lang) do |f|
  .field
    = f.label :name
    = f.text_field :name

Rails evals @lang.name

所以当表单看起来像这样

= f.fields_for :dictionary do |dic_form|
  .fieldset
    = dic_form.label :foo
    = dic_form.text_field :foo

@lang.dictionary.foo代码没有结果。

这里的解决方案是使用OpenStruct,如:

= form_for(@lang) do |f|
  .field
    = f.label :name
    = f.text_field :name
  .field
    = f.fields_for :dictionary, OpenStruct.new(@translation.dictionary) do |dic_form|
      fieldset
        = dic_form.label :foo
        = dic_form.text_field :foo
        br
        = dic_form.label :bar
        = dic_form.text_field :bar
  .actions = f.submit