2011-12-06 7 views
1

私はこの件に関していくつかの質問があり、this oneはそれを非常に詳しく説明していますが、受け入れられていないか、フォローアップされていません。Railsの新しいモデルフィールドが未定義のメソッドエラーを投げる

マイグレーションを使用してモデルに新しいフィールド 'is_ignored'を追加しました。フィールドは既にmysqlデータベースにあります。フィールドはschema.rbにリストされ、モデル定義でattr_accessibleとマークされていますが、値を割り当てようとすると未定義のメソッドエラーがスローされます。

ここで私は何をしているのですか。

移行(作品と予想されるようにフィールドを埋め):

def self.up 
    add_column :user, :is_ignored, :boolean 

    User.reset_column_information 
    User.find(:all).each do |p| 
     p.update_attribute :is_ignored, false 
    end 

スキーマ(RMに "宣言に行く" に注意してください、それはフィールドの作業と同じように、ここで私を取る):

create_table "users", :force => true do |t| 
    ... 
    t.datetime "updated_at" 
    t.boolean "is_ignored" 
    end 

コントローラ:

params[:selected_users].each do |id| 
    @user = User.find(id) 
    @user.is_ignored = false #here is where the error is being thrown 
    @user.save 
    end 

私はこれまでコントローラに投資していましたが、私が絶対にしなければならないならば、それは離れて、再足場を作る。私が見落とした可能性のあるモデルに新しいフィールドを手動で追加するには、いくつかのステップがありますか?

編集:私はまた、私は、このフィールドにアクセスして、レールのコンソールから値を設定して、コールが実行されたときに@userが私のコントローラではnilでないことを確認しました

。まだこの未定義メソッドエラーをスローします。

第二編集:

だから、これはかなりクールです。友人がこのメソッド呼び出しを次のように置き換えることを提案しました:

@user.update_attribute(:is_ignored, false) 

私たちはうまくいくと思っていましたが、そうしなかったのです!以前と同じ定義されていないメソッドエラーが投げられました...

+0

実際のエラーメッセージ/スタックトレースとは何ですか? –

+0

また、正しい環境で移行してもよろしいですか? –

+0

私は実際に以下の質問に答えました。デバッガは、私がdoブロックにパイプしていたidオブジェクトが、私がIDの配列として扱っていたハッシュの配列であることを明らかにしました... – BrMcMullin

答えて

1

私の友人は、私はこれを理解助け、それは私がフォームからIDを取得したかまで来てしまった:

<td><%= check_box_tag "selected_users[#{ignored_user.id}]" %></td> 

私はこれについて知らなかった何に何かを入れるということでした角括弧は期待どおりのオブジェクトの配列を作成しませんが、角括弧の中に置かれたオブジェクトによってキー設定されたチェックボックス値のハッシュを作成します。コントローラによって操作する場合ので、私はハッシュを伝承した

{'42'=>'1'} 

がダウンして行うブロックにパイプに2つ目のパラメータを自分のコードを変更し、このハッシュを分割し、私が選択したユーザーのIDに動作させます:

params[:selected_users].each do |id,value| 
    @user = User.find(id) 
    @user.is_ignored = false #here is where the error is being thrown 
    @user.save 
end 
0

フィールドを追加する必要はありません。そのフィールドは、列に基づいたフィールドです(アクティブなレコードは、追加のコードなしでフィールドを操作できます)。開発サーバーの再起動を試みましたか(「レールサーバー」を再実行してください)?

+0

実際には、アプリケーションの動作に何の変化もありません。私は、再起動する前に3000でリッスンしているプロセスがなかったことをcportsで確認しましたが、すべて効果がありません。 – BrMcMullin

+1

hmmm、データベースにログインして、その列がスキーマに存在することを確認できますか?あなたはレールのコンソールの内側にフィールドを設定することができますか? – jwarzech

+0

私はデータベースの列を参照し、それに対して照会することができました。コンソールからそれを取得しようとしていますが、最初はユーザーモデルに到達することにも問題があります。 – BrMcMullin

0

UserまたはUserFacebookFriend? - これらは私にとっては異なるモデルのようです。列を追加したのはUser

+1

おっと! SOに転記する前に、それをユーザーに変更するのを忘れました。一定。 – BrMcMullin

関連する問題