【译】给模型增加虚拟属性

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)。

This entry was tagged Rails and Best-Practices

comments powered by Disqus

© 2009-2013 lxneng.com. All rights reserved. Powered by Pyramid

go to Top