【问题标题】:rails update_attributes don't update valuerails update_attributes 不更新值
【发布时间】:2013-07-26 02:42:14
【问题描述】:

当尝试从消息模型更新值 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 列表中 帮助!

【问题讨论】:

    标签: ruby-on-rails update-attributes attr-accessible


    【解决方案1】:

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

    或

    msg1.reload.read_at
    

    【讨论】:

    • 尽管 @m 和 msg1 具有相同的 id,但使用 @m.update_attributes(read_at: Time.now) 将更新 仅来自 @m 的 read_at 属性。执行msg1.reload 后,它将更新 msg1.read_at 值。我不明白为什么?在我的 Message 模型中,如果我不在自己的消息中使用 reload ,则创建一个更新 attr 的函数将不起作用。你能解释一下为什么吗?我确实在其他 attr 上工作,只是在这一点上它不会自我更新
    【解决方案2】:

    为了更新值,你应该使用

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

    更多详情请参考documentation

    【讨论】:

      【解决方案3】:

      直接来自文档。

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

      例如,对于普通用户帐户,您只希望用户可以编辑登录名和密码。应该不可能通过批量分配来改变状态属性。

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

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

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

      如果你想更新状态属性,你应该单独分配它。

      @user.status = 'active'
      save
      

      或者只使用 update_attribute

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多