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表单之间保持不变?
答案 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