Как использовать Form_For для обновления хеш-атрибута в модели - PullRequest
4 голосов
/ 21 февраля 2012

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

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

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

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

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

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

-Nick

1 Ответ

6 голосов
/ 21 февраля 2012

Rails 3.2 представляет приятное дополнение к 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 %>
...