Редактировать сериализованный хэш в форме? - PullRequest
3 голосов
/ 30 июня 2011

Я сериализирую хэш, который хранится в поле settings в таблице, и хотел бы иметь возможность редактировать этот хэш в поле формы.

class Template < ActiveRecord::Base
  serialize :settings
end

Но я просто делаю <%= f.text_area :settings %>, тогда текстовая область просто показывает сериализованные данные вместо хеша.

Как получить хеш для отображения в текстовой области?

Ответы [ 3 ]

4 голосов
/ 01 июля 2011

Возможно, подойдет другой аксессор для вашей модели.

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

Тогда в вашей форме используйте <%= f.text_area :settings_edit %>.

Я не тестировал ни один из этого кода, но теоретическион должен работать.Удачи!

ПРЕДУПРЕЖДЕНИЕ. Использование eval, как это очень опасно, в этом примере пользователь может удалить всю таблицу шаблонов одной строкой в ​​поле редактирования Template.destroy_all.Используйте другой метод для преобразования строки в хеш, если используется пользовательский ввод.

2 голосов
/ 01 июля 2011

... или вы можете использовать что-то вроде этого (без какой-либо логики в модели):

<% @template.settings.each do |name, value| %>
  <div>
    <%= label_tag name %>
    <%= text_field_tag "template[settings][#{name}]", value %>
  </div>
<% end %>
0 голосов
/ 30 июня 2011

вы должны использовать что-то вроде

class Template < ActiveRecord::Base
  serialize :settings, Hash
end
...