【发布时间】: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