Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 是否编辑表单中的序列化哈希?_Ruby On Rails_Serialization_Hash - Fatal编程技术网

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 %>