2012-02-21 16 views
4

迅速な警告:私はRailsにはかなり新しく、知識は多少クッキーカッター風です。私は特定のことをする方法を知っていますが、私は彼らが常に働く理由をその重要な理解に欠いています。Form_Forを使用してモデルのハッシュ属性を更新する方法

私は現在、アドレス、電子メールなどのような情報を含むUserモデルを持っています。さらに、visibleと呼ばれるハッシュもあります。そのハッシュのキーは情報のそれぞれであり、値は、ユーザーが情報を公開するかどうかを示すために真または偽のいずれかです。これが最善の方法であるかどうかはわかりませんが、情報のビットごとにブール変数を大量に作る以外の方法は考えられません。最後に、私はシリアライズします:データベース内のストレージに可視化

私は、編集ビューで、可視属性を表す情報の各フィールドの横にチェックボックスを付けることをお勧めします。このトピックに関連する他の多くの記事を読んだ後、さまざまなコードを試してみると、私はいつも何らかのエラーで終わります。

<%= form_for(@user, :id => "form-info-personal") do |f| %> 
... 
<%= f.label :name %> 
<%= f.text_field :name %> 
<%= f.check_box :visible[: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)。 Gemfileでいくつかのgemのバージョンを変更するだけです。アップグレードしない理由はありません。 –

+0

さて、アップグレードは無痛で、モデルは更新されました。私はコンソールでそれを編集することができ、それは非常にうまく動作します。問題はフォームがこれらのフィールドを更新しているように見えないことだけです。なぜ私はこのことが分かりません。フォームはまだ他のすべてのフィールドを更新しますが、チェックボックスをtrueに変更すると、:設定フィールドが{}になります。何か案は? 更新:コンソールでname_visibleのようなフィールドの値を手動で設定すると、フォームの読み込み時にチェックボックスの表示方法が変更されますが、チェックボックスの値を変更してもデータベースの値は変更されません。 –

関連する問題