Ruby on rails 是否编辑表单中的序列化哈希?
我正在序列化存储在表中Ruby on rails 是否编辑表单中的序列化哈希?,ruby-on-rails,serialization,hash,Ruby On Rails,Serialization,Hash,我正在序列化存储在表中settings字段中的散列,并希望能够在表单字段中编辑该散列 class Template < ActiveRecord::Base serialize :settings end 类模板'bar'}?一个问题是,当您提交表单时,设置字段将被序列化为字符串,而不是散列,除非您向应用程序添加一些逻辑。逻辑最好符合模型。正确。我想看看{:foo=>'bar'}。是的,这是可行的,但是您需要在表单中添加更多的逻辑来向settings hash.yep添加新的键/值对
settings
字段中的散列,并希望能够在表单字段中编辑该散列
class Template < ActiveRecord::Base
serialize :settings
end
类模板
但是我只做了
,然后文本区域只显示序列化的数据,而不是散列
如何获得要在文本区域中显示的哈希值?您应该使用类似的
class Template < ActiveRecord::Base
serialize :settings, Hash
end
类模板
也许为您的模型设置另一个访问器会起作用
class Template < ActiveRecord::Base
serialize :settings
attr_accessor :settings_edit
before_save :handle_settings_edit, :if => lambda {|template| template.settings_edit.present? }
def settings_edit
read_attribute(:settings).inspect # should display your hash like you want
end
protected
def handle_settings_edit
# You may want to perform eval in your validations instead of in a
# before_save callback, so that you can show errors on your form.
begin
self.settings = eval(settings_edit)
rescue SyntaxError => e
self.settings = settings_edit
end
end
end
类模板lambda{| template | template.settings_edit.present?}
def设置\u编辑
read_属性(:settings).inspect#应按需要显示哈希值
结束
受保护的
def句柄设置编辑
#您可能希望在验证中执行eval,而不是在
#在保存回调之前,您可以在窗体上显示错误。
开始
self.settings=eval(设置\编辑)
rescue SYNTEXERROR=>e
self.settings=设置\u编辑
结束
结束
结束
然后在表单中使用
我没有测试过这些代码,但理论上它应该可以工作。祝你好运
警告:像这样使用
eval
是非常危险的,在本例中,用户可以在编辑框Template.destroy\u all
中删除整个模板表。如果涉及用户输入,请使用其他方法将字符串转换为哈希。。。。或者,您可以使用类似的方法(模型中没有任何逻辑):
不会更改文本区域的内容\u您希望在文本区域中看到什么?类似于{:foo=>'bar'}
?一个问题是,当您提交表单时,设置字段将被序列化为字符串,而不是散列,除非您向应用程序添加一些逻辑。逻辑最好符合模型。正确。我想看看{:foo=>'bar'}
。是的,这是可行的,但是您需要在表单中添加更多的逻辑来向settings hash.yep添加新的键/值对,事实上这将非常复杂:)因此,如果您有预定义的配置键,并且不希望添加或删除键,那么这种方法是可行的。实际上,这似乎不起作用。当我编辑表单并提交(更新)时,它不会将更改保存到设置
…它会保留以前的数据。是否有更改?您是否正在使用可访问的属性?如果是这样,请确保允许将批量分配到设置\u编辑
。没有任何更改,并且我没有使用attr\u accessible
。此操作已关闭。问题是语句“eval(settings_edit)”正在读取您上面定义的方法。我通过删除def settings_edit方法,而不是将“@template.settings_edit=@template.read_属性(:settings).inspect”行添加到控制器中的我的编辑操作中来实现这一点。对用户输入使用eval
是不安全的。恶意用户可以在表单字段中粘贴任何Ruby代码,并在您的服务器上执行。
<% @template.settings.each do |name, value| %>
<div>
<%= label_tag name %>
<%= text_field_tag "template[settings][#{name}]", value %>
</div>
<% end %>