【问题标题】:Rails: Adding methods to ActiveRecord modelsRails:向 ActiveRecord 模型添加方法
【发布时间】:2013-04-08 23:18:50
【问题描述】:

我正在编写我的第一个相当简单的 Ruby on Rails (3.2) 应用程序。这个想法是管理电子邮件帐户。架构相当简单:

t.string   "email"
t.string   "password"

ActiveRecord 模型定义为:

class Mailuser < ActiveRecord::Base
  attr_accessible :email, :password

我一直在使用带有 form_for(@mailuser)@mailuser.update_attributes(params[:mailuser]) 魔法的脚手架。效果很好。

现在的怪癖是应该只允许用户编辑电子邮件的 user 部分(例如“foo”),而 domain(例如“example. org") 必须保持不变。 email 字段包含完整的电子邮件地址(例如“foo@example.org”)。所以在编辑表单中我不显示字段

  • 电子邮件
  • 密码

而是

  • 用户部分
  • 密码

userpart 显示为@mailuser.userpart(可编辑)+ (不可编辑)。

所以我想我可以通过为用户部分添加一个 getter 和 setter 来解决这个问题:

class Mailuser < ActiveRecord::Base
   attr_accessible :email, :password

   # Getter for the user part (left of '@')
   def userpart
      email.split('@')[0]
   end

   # Setter for the user part (left of '@')
   def userpart=(new_userpart)
      email = email.sub(/(.+)@/, new_userpart+"@")
   end

事实上,获得@mailuser.userpart 效果很好。它甚至可以在form_for(@mailuser) 中正确显示。但是在控制器的update 方法中使用@mailuser.update_attributes(params[:mailuser]) 保存表单时会出现问题。 Rails 显然试图从通过attr_accessible 提供的属性更新@mailuser 对象。但是userpart 属性并不反映实际的数据库字段。

所以我想知道将这些方法添加到 ActiveRecord 模型以添加功能的正确方法是什么?我习惯了 Pylons(一个 Python MVC 框架),我可以一直使用这样的附加方法。

(事实上你想知道:我不能通过更改数据库架构来拆分用户和域部分。数据库被其他应用程序使用,所以我坚持它的外观。)

提前致谢。

【问题讨论】:

  • 您可以张贴您的表格吗?
  • 表单基本上是(抱歉,stackoverflow 不允许它更好)

    @

标签: ruby-on-rails ruby activerecord


【解决方案1】:

您想添加 attr_accessible :userpart 以便用户部分可以通过 update_attributes 批量分配进行更新。

补充:userpart是一个虚拟属性的例子,如果你想向谷歌先生寻求更详细的解释。

【讨论】:

  • 谢谢 - 谷歌搜索 虚拟属性 帮助了我很多。显然,如果我将email = email.sub(/(.+)@/, new_userpart+"@") 替换为self.email = email.sub(/(.+)@/, new_userpart+"@"),我会得到工作代码。我认为 self 是指类属性而不是实例属性。所以我不明白为什么会这样。但显然确实如此。
  • 谢谢。那是指覆盖属性的行为。我宁愿添加虚拟属性。但是感谢您的链接。
  • 是的,我学到了一些关于自我和虚拟属性的知识!好问题。
【解决方案2】:

解决方案的关键是虚拟属性。在我的示例中,实际的解决方案是:

  • 分配self.email 而不是email 以更改实例变量的值。仅使用 email 刚刚创建了一个局部变量。 (我不知道省略 self 只是 Ruby 的一个便利功能,在这种情况下可能会导致混淆。)
  • 在模型中使用attr_accessible :userpart

这在(非免费)http://railscasts.com/episodes/16-virtual-attributes-revised?autoplay=true 截屏视频中有很好的解释。我想知道 Rails 官方文档在哪里解释了 虚拟属性

【讨论】:

猜你喜欢
  • 2011-05-28
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2016-08-31
  • 2017-12-27
相关资源
最近更新 更多