【问题标题】:How To Use Form_For to Update a Hash Attribute in the Model如何使用 Form_For 更新模型中的哈希属性
【发布时间】:2012-03-11 09:41:45
【问题描述】:

快速警告:我对 Rails 还很陌生,而且我的知识有点千篇一律。我知道如何做某些事情,但我缺乏对它们为什么总是有效的重要理解。

我目前有一个用户模型,其中包含大量信息,例如地址、电子邮件等。此外,它还有一个称为可见的哈希。该散列中的键是每条信息,值是真还是假,表示用户是否希望该信息公开可见。虽然我不确定这是否是最好的方法,但除了为每一位信息制作大量布尔变量之外,我想不出任何其他方法。最后,我序列化 :visible 用于存储在数据库中

我希望在我的编辑视图中在表示可见属性的每个信息字段旁边有一个复选框。在阅读了与该主题相关的大量其他帖子并尝试了许多代码变体之后,我总是以某种错误告终。对我来说最直观正确的代码如下:

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

但我收到一条错误消息,提示无法将符号解析为整数。我不确定这个解析甚至试图在哪里发生,除非它查看 :visible 作为一个数组并尝试使用 :name 作为索引。

如果这个问题微不足道/看似荒谬/缺乏重要信息/等,我提前道歉。任何提示、建议、链接或您拥有的任何东西都将不胜感激,即使它们是类似于“您这样做从根本上错误,请返回并以这种方式进行操作”。

-尼克

【问题讨论】:

  • 远离序列化。这是您遇到的第一个问题,但是由于序列化,您会遇到更多问题。添加特定的列完全没有错。
  • @wanghq:序列化没什么问题(如果你做得对的话)。

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


【解决方案1】:

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 %>

【讨论】:

  • 您认为是否值得将我的应用程序从 3.1 更新到 3.2 以进行此添加?由于这是我的第一个 Rails 应用程序,我不知道“升级”有多么困难。除非我弄错了,Rails 并不能确保向后兼容,所以在我试图以某种方式让生活更轻松的过程中,总会有一些变化,但我发现自己遇到了许多新问题。
  • 3.1 到 3.2 的升级是 absolutely painless。您只需在 Gemfile 中更改一些 gem 版本。没有理由不升级。
  • 好的,所以升级很轻松,模型也更新了。我可以在控制台中编辑它,它工作得很好。唯一的问题是表单似乎没有更新这些字段。我不知道为什么会这样;表单仍会更新所有其他字段,但将复选框更改为 true 仍会导致 :settings 字段为 {}。有任何想法吗?更新:在控制台中手动设置 name_visible 等字段的值会导致复选框在表单加载时的外观发生变化,但更改复选框的值不会更改数据库中的值。
  • 啊哈!每个单独的字段都需要是 attr_accesible,而不仅仅是通用字段 (:settings)。一切正常:)
  • @ngmiceli:酷!我只是在为你编写一个测试示例:)
猜你喜欢
  • 2021-01-22
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 2011-03-16
  • 2014-09-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多