2012-05-06 8 views
3

В приложении Rails 3.2 у меня есть модель с текстовым столбцом :data. В модели у меня есть:Как получить сериализованные данные?

class Model 
    serialize :data, Hash 
end 

Это правильно хранить данные в формате data:{"attr1"=>"foo", "attr2"=>"bar"....}.

Если я хочу отобразить это в представлении шоу, я могу сделать <%= @model.data %>, и весь хэш отображается.

Но что делать, если мне нужно только визуализировать определенный атрибут? Это возможно?

я пробовал несколько подходов, которые, казалось, как они могли бы работать:

<%= @model.data.attr1 %> - генерирует undefined method 'attr1' <%- @model.data[:attr1] %> - ничего не отображается

ли я что-то отсутствует? . Спасибо за любые указатели

ответ

8
<%- @model.data[:attr1] %> 

Заменить:

<%= @model.data["attr1"] %> 

ПРИМЕЧАНИЕ: <%= в начале. Вы ошибочно использовали <%-.

UPD:

Я рекомендую использовать HashWithIndifferentAccess:

serialize :data, HashWithIndifferentAccess 

Таким образом, вы можете получить ваши значения с помощью символов или строк в качестве ключа.

+0

doh! в этом есть смысл. благодаря! Можете ли вы порекомендовать любую полезную информацию о HashWithIndifferentAccess? Из моих поисков он не очень хорошо освещен. Является ли он широко распространенным или может быть устаревшим? Мне нравится простота синтаксиса, но я не хочу, чтобы меня оставляли высоко и сухо :) –

+0

Не так много объяснять, так как этот класс имеет 'Hash', поскольку он является родителем и позволяет использовать символы вместо ключей. Но этот класс EXTENSIVELY используется Rails. Еще больше: ActiveSupport добавляет метод 'with_indifferent_access' к' Hash' самому, чтобы вернуть экземпляр HashWithIndifferentAccess'. Попытайтесь поместить '<% = params.class%>' в любое ваше мнение и убедитесь, что я не шучу) – jdoe

2

Вы попробовали строковый формат клавиши Hash?

@model.data['attr1'] 
+0

Спасибо Suborx, я должен был попробовать это, но не сделал! Я получил ответ на jdoe за дополнительную информацию о сериализации, но имеет знак «вверх». –

+0

+1 от меня тоже) Время говорит, что вы были первыми. – jdoe

+0

Спасибо, ребята, я также отмечаю ответ jdoes сразу после того, как я заметил. А теперь +1 за вопрос. ;) – Suborx