2012-04-05 16 views
2

レール3のデータベース列を更新または変更できないような問題はありません。それが私が見落としているほど小さいと確信しています。助けてください!Rails 3:データベースレコードがアクティブレコードで更新されない

IRB出力:

ruby-1.9.2-p318 :002 > User.all 
     User Load (0.1ms) SELECT "users".* FROM "users" 
    => [] 
    ruby-1.9.2-p318 :003 > User.create(:login => "dummy", :password => "foobar", :password_ 
    confirmation => "foobar", :role => "user", :email => "[email protected]") 
     (0.1ms) begin transaction 
     User Exists (0.1ms) SELECT 1 FROM "users" WHERE "users"."login" = 'dummy' LIMIT 1 
     User Exists (0.0ms) SELECT 1 FROM "users" WHERE "users"."email" = '[email protected]' L 
    IMIT 1 
     SQL (0.8ms) INSERT INTO "users" ("created_at", "email", "hashed_password", "login", " 
    role", "salt", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) [["created_at", Thu, 05 Apr 2 
    012 02:21:00 UTC +00:00], ["email", "[email protected]"], ["hashed_password", "6416111c47f 
    a52ddfbde9e539ee6e369807bdeab"], ["login", "dummy"], ["role", nil], ["salt", "1LTzevgRHt 
    "], ["updated_at", Thu, 05 Apr 2012 02:21:00 UTC +00:00]] 
     (61.5ms) commit transaction 
    => #<User id: 3, login: "dummy", role: nil, hashed_password: "6416111c47fa52ddfbde9e539 
    ee6e369807bdeab", email: "[email protected]", salt: "1LTzevgRHt", created_at: "2012-04-05 
    02:21:00", updated_at: "2012-04-05 02:21:00"> 
    ruby-1.9.2-p318 :004 > u = User.first 
     User Load (0.2ms) SELECT "users".* FROM "users" LIMIT 1 
    => #<User id: 3, login: "dummy", role: nil, hashed_password: "6416111c47fa52ddfbde9e539 
    ee6e369807bdeab", email: "[email protected]", salt: "1LTzevgRHt", created_at: "2012-04-05 
    02:21:00", updated_at: "2012-04-05 02:21:00"> 
    ruby-1.9.2-p318 :005 > u.role 
    => nil 
    ruby-1.9.2-p318 :006 > u.role = "foo" 
    => "foo" 
    ruby-1.9.2-p318 :007 > u.role 
    => "foo" 
    ruby-1.9.2-p318 :008 > u 
    => #<User id: 3, login: "dummy", role: nil, hashed_password: "6416111c47fa52ddfbde9e539 
    ee6e369807bdeab", email: "[email protected]", salt: "1LTzevgRHt", created_at: "2012-04-05 
    02:21:00", updated_at: "2012-04-05 02:21:00"> 

移行:

class CreateUsers < ActiveRecord::Migration 
     def change 
     create_table :users do |t| 
      t.column :login, :string 
      t.column :role, :string 
      t.column :hashed_password, :string 
      t.column :email, :string 
      t.column :salt, :string 
      t.timestamps 
     end 
     end 
    end 

スキーマ:

ActiveRecord::Schema.define(:version => 20120318205424) do 

     create_table "users", :force => true do |t| 
     t.string "login" 
     t.string "role" 
     t.string "hashed_password" 
     t.string "email" 
     t.string "salt" 
     t.datetime "created_at",  :null => false 
     t.datetime "updated_at",  :null => false 
     end 

    end 

モデル:

require 'digest/sha1' 
    class User < ActiveRecord::Base 
     validates_length_of :login, :within => 3..40 
     validates_length_of :password, :within => 4..40 
     validates_presence_of :login, :email, :password, :password_confirmation, :salt 
     validates_uniqueness_of :login, :email 
     validates_confirmation_of :password 
     validates_format_of :email, :with => /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i, :message => "Invalid email" 

     attr_accessor :password, :password_confirmation, :role 
     attr_protected :id, :salt 

     def self.random_string(len) 
     chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a 
     newpass = "" 
     1.upto(len) { |i| newpass << chars[rand(chars.size-1)] } 
     return newpass 
     end 

     def password=(pass) 
     @password=pass 
     self.salt = User.random_string(10) if !self.salt? 
     self.hashed_password = User.encrypt(@password, self.salt) 
     end 

     def self.encrypt(pass, salt) 
     Digest::SHA1.hexdigest("#{pass}#{salt}") 
     end 

     def self.authenticate(login, pass) 
     u=find(:first, :conditions=>["login = ?", login]) 
     return nil if u.nil? 
     if User.encrypt(pass, u.salt)==u.hashed_password 
      # edits wont save without this 
      u.password=u.password_confirmation=pass 
      return u 
     end 
     nil 
     end 

     def send_new_password 
     new_pass = User.random_string(10) 
     self.password = self.password_confirmation = new_pass 
     self.save 
     Notification.deliver_forgot_password(self.email, self.login, new_pass) 
     end 

     def admin? 
     (self.role == "admin") 
     end 

    end 

SQLiteの更新、それが動作表示する:あなたが与えることができる任意の助け

sqlite> select * from users; 
    3|dummy||6416111c47fa52ddfbde9e539ee6e369807bdeab|[email protected]|1LTzevgRHt|2012-04-05 02:21:00.752890|2012-04-05 02:21:00.752890 
    sqlite> select role from users; 

    sqlite> select role from users where login = "dummy"; 

    sqlite> update users set role = "user" where login = "dummy"; 
    sqlite> select role from users where login = "dummy"; 
    user 
    sqlite> select * from users; 
    3|dummy|user|6416111c47fa52ddfbde9e539ee6e369807bdeab|[email protected]|1LTzevgRHt|2012-04-05 02:21:00.752890|2012-04-05 02:21:00.752890 

私はしばらくの間、このをいじってきた...感謝を。リクエストに応じて

EDIT:

ruby-1.9.2-p318 :011 > User.last.update_attributes!(:role => "foo") 
     User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 
     (0.1ms) begin transaction 
     User Exists (0.1ms) SELECT 1 FROM "users" WHERE ("users"."login" = 'dummy' AND "users"."id" != 3) LIMIT 1 
     User Exists (0.1ms) SELECT 1 FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 3) LIMIT 1 
     (0.1ms) rollback transaction 
    ActiveRecord::RecordInvalid: Validation failed: Password is too short (minimum is 4 characters), Password can't be blank, Password confirmation can't be blank 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/validations.rb:56:in `save!' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/attribute_methods/dirty.rb:33:in `save!' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/transactions.rb:246:in `block in save!' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/transactions.rb:208:in `transaction' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/transactions.rb:293:in `with_transaction_returning_status' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/transactions.rb:246:in `save!' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/persistence.rb:224:in `block in update_attributes!' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/transactions.rb:208:in `transaction' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/transactions.rb:293:in `with_transaction_returning_status' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/persistence.rb:222:in `update_attributes!' 
      from (irb):11 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/railties-3.2.2/lib/rails/commands/console.rb:47:in `start' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/railties-3.2.2/lib/rails/commands/console.rb:8:in `start' 
      from /home/jmervine/Development/personal/blog/vendor/bundle/ruby/1.9.1/gems/railties-3.2.2/lib/rails/commands.rb:41:in `<top (required)>' 
      from script/rails:6:in `require' 
      from script/rails:6:in `<main>'ruby-1.9.2-p318 :012 > User.last.update_attributes!(:role => "foo") 
+0

はあなたがUser.last.update_attributes 'の出力を貼り付けることができ、このラインから:roleを削除する!(:役割=> "foo" を)' – shime

+0

私は」それを加えました。パスワードとpassword_confirmationが検証要件を満たしていることを確認しました。私はそれが問題ではないと確信しています。 – jmervine

答えて

4

attr_accessor :password, :password_confirmation, :role

+0

さて、それは働いた...なぜ、あなたが気にしないなら? – jmervine

+3

あなたのスキーマに ':role'を追加すると、ActiveRecordはあなたが' user.role'と言うとき、それがデータベースから読み込まれた時に読み込まれる '@ attributes'ハッシュから読みとるべきことを知っています。 'user.role'に代入すると' @ attributes'ハッシュに書き込む必要があります。基本的に、ActiveRecordはこれを行うために#roleと#role = methodsを作成しています。 2つのこと:1) 'attr_accessor:role'と言って、これらのメソッドをオーバーライドします。 2) '@属性'ハッシュはあなたが 'user.inspect'と言うときに読み込まれるので、あなたの変更が反映されなかったのです。 –

+1

アクセッサとして 'role'を定義すると、それはARのリーダーとライターのメソッドをオーバーライドします – MikDiet

関連する問題