【译】给模型增加虚拟属性
Saturday, July 24, 2010原文: http://rails-bestpractices.com/posts/4-add-model-virtual-attribute
不要在控制器中指定模型的属性,给模型添加虚拟的属性把属性赋值移到模型中
丑陋的...
<% form_for @user do |f| %> <%= text_field_tag :full_name %> <% end %> class UsersController < ApplicationController def create @user = User.new(params[:user]) @user.first_name = params([:full_name]).split(' ', 2).first @user.last_name = params([:full_name]).split(' ', 2).last @user.save end end
在这个例子中, 用户表单中有个全名(full_name)属性, 但是我们希望分别保存名(first_name)和姓(last_name)到数据库表中, 所以这里在控制器中使用了分割全名来给@user对象的名(first_name)和姓(last_name)赋值。 但是给对象赋值不是控制器的工作呀, 所以可以通过给模型添加虚拟属性来处理这个问题
重构...
class User < ActiveRecord::Base def full_name [first_name, last_name].join(' ') end def full_name=(name) split = name.split(' ', 2) self.first_name = split.first self.last_name = split.last end end <% form_for @user do |f| %> <%= f.text_field :full_name %> <% end %> class UsersController < ApplicationController def create @user = User.create(params[:user]) end end
现在用户模型中添加了一个虚拟属性(full_name=), 它的功能就是给名(first_name)和姓(last_name)赋值, 很酷吧, 这样我们只要一行代码就能创建用户了,用户模型自己会分割全名(full_name)属性赋值给名(first_name)和姓(last_name)。