2012-02-21 1 views
4

Быстрое предупреждение: я довольно новичок в Rails, и мои знания - это нечто вроде cookie-cutter-esque. Я знаю, как делать определенные вещи, но мне не хватает этого жизненно важного понимания того, почему они всегда работают.Как использовать Form_For для обновления атрибута хеширования в модели

В настоящее время у меня есть модель пользователя, в которой есть куча информации, такой как адрес, адрес электронной почты и т. Д. Кроме того, у нее также есть хэш, видимый. Ключи в этом хэше - это каждая из частей информации, и значение является либо истинным, либо ложным для того, хочет ли пользователь, чтобы информация была общедоступной. Хотя я не уверен, что это лучший способ пойти, я не могу думать ни о каком другом способе, кроме создания целого количества булевых переменных для каждого бита информации. Наконец, я сериализую: видимый для хранения в базе данных

Что бы я хотел, в моем представлении редактирования есть флажок рядом с каждым полем информации, которое представляет видимый атрибут. После прочтения множества других сообщений, связанных с этой темой и попыток многочисленных вариантов кода, я всегда получаю какую-то ошибку. Код, который выглядит наиболее интуитивно правильно мне выглядит следующим образом:

<%= form_for(@user, :id => "form-info-personal") do |f| %> 
... 
<%= f.label :name %> 
<%= f.text_field :name %> 
<%= f.check_box :visible[:name] %> 

Но я получаю сообщение об ошибке, говорящее о том, что символ не может быть проанализирован в целое число. Я не уверен, что этот синтаксический анализ даже пытается произойти, если только его просмотр: видимый как массив и не пытается использовать: name как индекс.

Я заранее извиняюсь, если этот вопрос тривиальный /, казалось бы, бессмысленный/недостающий жизненной информации/и т. Д. Любые советы, предложения, ссылки или то, что вам было бы очень полезно, даже если они соответствуют строкам «вы делаете это в корне неправильно, возвращайтесь и делайте это так».

-Nick

+0

Держитесь подальше от сериализации. Это первая проблема, которую вы получили, но у вас будет больше проблем из-за сериализации. Добавление определенных столбцов не является ошибкой. – wanghq

+0

@wanghq: Нет ничего плохого в сериализации (если вы готовите его правильно). –

ответ

6

Rails 3.2 вводит nice addition to ActiveRecord, который позволяет хранить произвольные параметры в одном поле.

class User < ActiveRecord::Base 
    store :settings, accessors: [ :color, :homepage ] 
end 

u = User.new(color: 'black', homepage: '37signals.com') 
u.color       # Accessor stored attribute 
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor 

Таким образом, ваш код может выглядеть следующим образом:

# model 
class User < ActiveRecord::Base 
    store :settings, accessors: [ :name_visible, :email_visible ] 

end 

# view 
<%= f.label :name %> 
<%= f.text_field :name %> 
<%= f.check_box :name_visible %> 
+0

Как вы думаете, стоит ли обновлять мое приложение от 3,1 до 3,2 для этого добавления? Поскольку это мое первое приложение Rails, я не знаю, насколько сложно было бы «обновить». Если я не ошибаюсь, Rails не гарантирует обратную совместимость, так что всегда есть изменения, которые в моей попытке сделать жизнь проще в одном направлении, я нахожусь с множеством новых проблем. –

+0

3.1 - 3.2 обновление [абсолютно безболезненно] (http://guides.rubyonrails.org/3_2_release_notes.html#upgrading-to-rails-3-2). Вам просто нужно изменить некоторые версии gem в Gemfile. Нет причин не обновляться. –

+0

Хорошо, поэтому обновление было безболезненным, и модель обновилась. Я могу редактировать его в консоли, и он работает очень хорошо. Только проблема заключается в том, что форма не обновляет эти поля. Я понятия не имею, почему это так; форма все еще обновляет все остальные поля, но изменение флажка в true по-прежнему приводит к тому, что поле настроек: {}. Есть идеи? Обновление: вручную установка значения поля, такого как name_visible в консоли, приводит к изменению способа отображения флажка при загрузке формы, но изменение значения флажка не изменяет значение в базе данных. –