如何使用Form_For更新模型中的哈希属性

时间:2012-02-21 02:52:07

标签: ruby-on-rails ruby-on-rails-3 hash form-for

快速警告:我对Rails很陌生,而且我的知识有些奇特。我知道如何做某些事情,但我缺乏对他们为何一直工作的重要理解。

我目前有一个用户模型,其中包含大量信息,如地址,电子邮件等。此外,它还有一个名为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 个答案:

答案 0 :(得分: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 %>