2012-02-21 81 views
4

一個快速警告:我對Rails很新穎,而且我的知識有些過時。我知道如何做某些事情,但我缺乏對他們總是工作的重要理解。如何使用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 2012-02-21 03:06:46

+0

@wanghq:序列化沒有任何問題(如果你做對了)。 – 2012-02-21 03:29:00

回答

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不能保證向後兼容性,所以總是會有這樣的變化,在我嘗試以一種方式簡化生活的過程中,我發現自己遇到了許多新問題。 – 2012-02-21 03:53:07

+0

3.1到3.2升級是[絕對無痛](http://guides.rubyonrails.org/3_2_release_notes.html#upgrading-to-rails-3-2)。您只需在Gemfile中更改一些gem版本。沒有理由不升級。 – 2012-02-21 03:54:11

+0

好的,所以升級無痛並且模型更新。我可以在控制檯中進行編輯,它的工作原理非常好。唯一的問題是表單看起來並沒有更新這些字段。我不知道這是爲什麼;表單仍會更新所有其他字段,但將複選框更改爲true仍然會導致:settings字段爲{}。有任何想法嗎? 更新:在控制檯中手動設置字段的值(如name_visible)會導致複選框在表單加載上查看的方式發生變化,但更改複選框的值不會更改數據庫中的值。 Aha! – 2012-02-21 16:53:59