0

さて、私はここで何が間違っているのか理解できません

私はユーザーが管理者によって承認されているこのアプリを持っています、そしてこれは数日前までうまく機能していました

私の見解では、ユーザーコントローラーを呼び出すリンクがあります

<%= link_to 'Approve', active_user_path(user), :method => :put %>

これがそのリンクの私のcustumルートです

match "users/:id/activate" => "users#activate", :as => "active_user"

今私のユーザーコントローラーで私はこのアクティベートメソッドを持っています

def activate
  @user = User.find(params[:id])

  puts @user.name #the correct name is displayed
  puts @user.is_approved.inspect.to_i #:is_approved is 0

  if @user.update_attribute(:is_approved, 1) 

  puts @user.is_approved.inspect # :is_approved is 1

  @user.activate_user

  puts @user.is_approved.inspect # :is_approved is 1

  @user.save!

  redirect_to "/users?is_approved=0"

  else
   render "/" # dosn't matter
  end 
end

ここで3回保存しようとしましたが(update、activate_user、save!)、それでも値は保存されません。usersis_approvedフィールドはまだ0ですが、どうすれば可能ですか?

これが私のモデルメソッドです

def activate_user
  self.is_approved = 1
  self.save
end

ところで、私はこのメソッドで文字列を更新できますが、整数は更新できません(trueとfalseのどちらも機能しません)

私のモデルではis_approved、attr_accessibleとattr_accessorの両方があります

ソリューション

これは厄介ですが、私のユーザーモデルattr_accessor :approved では、モデルがデータベースに移動して:approved列を更新することはありませんでしたが、代わりにローカル変数が更新された:approvedため、次に列を確認したときに、もちろん:approved値は変更されていません

tldr?モデルにattr_accessorがあり、更新しようとしている列と同じ名前の場合=>削除します

4

2 に答える 2

2

データベース列に裏打ちされた属性には使用attr_accessorしないでください。によって生成されたアクセサーattr_accessorは、データベースに格納されている値をマスクします。

于 2012-11-21T14:32:29.637 に答える
1

update_attributeは、実際には1つの列を更新するだけではありません。

  • 検証はスキップされます。

  • コールバックが呼び出されます。

  • updated_at / updated_on列は、その列が使用可能な場合に更新されます。

  • このオブジェクトでダーティであるすべての属性を更新します。

ユーザーモデルにコールバックはありますか?コールバックのどこかで列が更新されていないことを確認してください。

于 2012-11-21T14:31:05.043 に答える