2

我正在编写我的第一个相当简单的 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])效果很好。

现在的怪癖是应该只允许用户编辑电子邮件的用户部分(例如“foo”),而(例如“example.org”)必须保持不变。然而,电子邮件字段包含完整的电子邮件地址(例如“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). @mailuser.update_attributes(params[:mailuser])但是使用控制器的update方法保存表单时会出现问题。Rails 显然试图@mailuser从通过attr_accessible. 但该userpart属性并不反映实际的数据库字段。

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

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

提前致谢。

4

2 回答 2

2

您要添加attr_accessible :userpart以便可以通过 update_attributes 批量分配更新 userpart。

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

于 2013-04-09T00:28:59.863 回答
0

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

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

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

于 2013-04-09T11:42:59.537 回答