我正在编写我的第一个相当简单的 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 框架),我可以一直使用这样的附加方法。
(事实上你想知道:我不能通过更改数据库模式来拆分用户和域部分。数据库被其他应用程序使用,所以我坚持它的外观。)
提前致谢。