Ruby on Rails - 我可以在保存之前修改数据吗?

Spl*_*Tea 44 ruby ruby-on-rails

快速示例:用户在表单中输入用户名,在将其存储在应用程序的数据库中之前,我需要创建该文本用户名,从而使其永久小写.

我将把这段代码放在哪里,以及如何访问要小写的数据?

谢谢.

Mic*_*ert 80

你应该覆盖属性writer:

class User < ActiveRecord::Base
  def username=(val)
    write_attribute(:username, val.downcase)
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是更好的解决方案.即使在将对象保存到数据库之前,它也将确保一致性. (4认同)

小智 51

您可以在User模型中使用ActiveRecords回调之一,例如:

before_save { |user| user.username = user.username.downcase }
Run Code Online (Sandbox Code Playgroud)


Jam*_*her 16

在您的用户模型(models/user.rb)中,利用ActiveRecord回调:

before_save do
  self.username = self.username.downcase
end
Run Code Online (Sandbox Code Playgroud)


Ale*_*ine 6

我花了一段时间查找一个阻止我使用此代码的错误.每次我尝试拦截属性并false在保存之前将其更改为我的数据库都会回滚.

我在这里贡献我的答案,因为这个帖子是完成此任务的第一个Google结果,但没有涵盖整个返回的false问题.

如果您的任何回调返回,则false所有内容都将在数据库中回滚.

我试图将要创建的商品设置为不在数据库中接受或@offer.accepted = false.问题是这一行导致整个方法返回false并回滚整个过程.

我在一个隐含的回报折腾修好了true之后

有效的代码:

before_save {|offer| offer.accepted = false; true}

外卖:false如果您希望它们成功,您的回调将无法返回.

来源:rails 3:我需要在before_save回调中返回true才能使object.save工作吗?


小智 6

def username=(str)
 super(str.downcase)
end
Run Code Online (Sandbox Code Playgroud)

我认为这容易多了。