update_attributes不更新值的轨道



尝试从消息模型更新值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_manybelongs_to之后,我看不到它在哪里,因为我确实将read_at放在了attr_accessible列表上救命!

您应该在msg1.read_at 之前运行msg1.reload

msg1.reload.read_at

为了更新值,您应该使用

@m.update_attributes(:read_at => Time.now)

有关更多详细信息,请参阅文档。

直接从文档中获取。

使用attr_accessible可防止(由用户)大量分配用户不应编辑的属性。质量指定用于创建和更新标准控制器的方法。

例如,对于普通用户帐户,您只希望登录名和密码可由用户编辑。不能通过批量指定更改状态属性。

class User < ActiveRecord::Base   
  attr_accessible :login, :password
end

因此,执行以下操作将愉快地返回true,但不会更新status属性。

@user.update_attributes(:status => 'active')

如果要更新状态属性,则应单独指定它。

@user.status = 'active'
save

或者只使用update_attribute

相关内容

  • 没有找到相关文章

最新更新