3

フォームが送信された後、正しいカスタムパラメータがデバッグ機能に表示されますが、コンソールに入るとデフォルトのパラメータが表示されます。

コントローラ

def update
    current_user.update_attributes(params[:user])
    flash[:success] = "Your settings have been saved!"
    render new_status_update_path
end                                         

モデル

attr_accessible :deficit_pct,
              :target_bf_pct,
              :activity_factor

ノート:

  • SOでこれに最も近い質問は、関連付けを通じて存在するオブジェクトの属性を変更する質問です。

  • Object.updateメソッドを使用しようとしましたが、次のようなエラーが発生します。

    プライベートメソッド`update'が#を要求しました

何か案は?

ありがとう!

4

4 に答える 4

4

コードを試してください:-

def update
    if current_user.update_attributes(params[:user])
        flash[:success] = "Your settings have been saved!"
        render new_status_update_path
    else
        p 111111111111
        p  current_user.errors.inspect
    end
end

ログでエラーがないか確認した後、そのアクティブレコードに存在します

于 2013-01-01T17:08:41.677 に答える
3

コンソールで遊んだ後、属性を手動で変更しても、コンソールを終了した後、属性が「固定」されないことがわかりました。

そこで、コンソールに入り、ユーザー属性を変更し、テストすると、変更されます。私が存在して再入力した場合、それらをテストすると、デフォルト値に戻ります。

これにより、デフォルト値を設定するユーザーモデル内の「after_initialize」メソッドが各保存後に実行されていると思います。オブジェクトが初めて単独で保存された後にのみ実行されると思いましたが、今では保存されるたびに実行されることがわかりました。

after_initialize :default_values 

def default_values
  self.goal = "Cut"
  self.measurement = "US"
  self.bmr_formula = "katch"
  self.fat_factor = 0.655
  self.protein_factor = 1.25 
  self.deficit_pct = 0.10
  self.target_bf_pct = 0.10
  self.activity_factor = 1.3
end

これらの値とafter_initializeメソッドをすべて削除すると、永続的に保存されます。

于 2012-12-31T00:31:07.297 に答える
1

検証エラーがないことを確認する必要があります。以下を使用して確認できます。

active_record_model.errors

あなたの場合、それは

current_user.errors

また、からの戻り値を出力して、またはであるかupdate_attributesどうかを確認する必要があります。を取得した場合、保存はキャンセルされました。これは、検証エラーまたはコールバックがを返すことが原因である可能性があります。truefalsefalsefalse

于 2012-12-30T19:43:56.163 に答える
1

何かのようなもの:


def update
    if current_user.update_attributes(params[:user])
        flash[:success] = "Your settings have been saved!"
        render new_status_update_path
    else
        some_error_handling_code
    end
end

保存が失敗した場合、成功は表示されません。原則として、エンドユーザーに成功を報告する前に、保存またはその他のバックエンド操作が失敗するかどうかを確認する必要があります。

于 2012-12-30T21:10:54.300 に答える