尝试从消息模型更新值 read_at 时,使用 update_attributes 函数没有任何效果。
这是消息表
class CreateMessages < ActiveRecord::Migration
def change
create_table :messages do |t|
t.integer :sender_id, null: false
t.integer :receiver_id
t.string :subject
t.text :body
t.datetime :read_at
t.string :container, default: "draft"
t.boolean :sender_deleted, default: false
t.boolean :receiver_deleted, default: false
t.timestamps
end
end
def down
drop_table :messages
end
end
这是消息模型
class Message < ActiveRecord::Base
attr_accessible :subject, :body, :container, :sender_id, :receiver_id, :read_at
belongs_to :sender,
class_name: 'User'
belongs_to :receiver,
class_name: 'User'
这是用户模型
class User < ActiveRecord::Base
has_many :messages_sent,
class_name: 'Message',
foreign_key: 'sender_id',
dependent: :destroy
has_many :messages_received,
class_name: 'Message',
foreign_key: 'receiver_id',
dependent: :destroy
然后在终端
user1 = User.create(name: "user1_name", email: "user1@email.com", password: "foobar", password_confirmation: "foobar")
user2 = User.create(name: "user2_name", email: "user2@email.com", password: "foobar", password_confirmation: "foobar")
msg1 = Message.create(sender_id: user1.id, receiver_id: user2.id, subject: 'subject_msg1', body: 'body_msg1')
msg1.save
@m = Message.find(msg1.id)
@m.update_attributes(read_at: Time.now)
我得到了这个输出:
@m.read_at
=>datestamped
msg1.read_at
=>nil
我确实在这里遗漏了一些东西,但是在更改并重新更改 has_many 和 belongs_to 之后我无法看到它们的位置,因为我确实将 read_at 放在 attr_accessible 列表上 帮助!
答案 0 :(得分:3)
您应该在msg1.reload
msg1.read_at
或
msg1.reload.read_at
答案 1 :(得分:1)
答案 2 :(得分:0)
直接来自文档。
使用attr_accessible防止(用户)对用户不应编辑的属性进行质量分配。质量分配用于标准控制器的创建和更新方法。
例如,对于普通用户帐户,您只希望用户可以编辑登录名和密码。不应该通过质量分配来改变状态属性。
class User < ActiveRecord::Base
attr_accessible :login, :password
end
因此,执行以下操作将快速返回true,但不会更新status属性。
@user.update_attributes(:status => 'active')
如果要更新状态属性,则应单独分配。
@user.status = 'active'
save
或只使用update_attribute