`
hideto
  • 浏览: 2655459 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Rails宝典之第十六式: 虚拟属性

    博客分类:
  • Ruby
阅读更多
看一个场景,用户注册时需要填写First Name,Last Name,Password:
<h1>Register</h1>
<% form_for :user, :url => users_path do |f| %>
  <p>
    First Name<br/>
    <%= f.text_field :first_name %>
  </p>
  <p>
    Last Name<br/>
    <%= f.text_field :last_name %>
  </p>
  <p>
    Password<br/>
    <%= f.password_field :password %>
  </p>
  <p>
    <%= submit_tag 'Register' %>
  </p>
<% end %>

我们可以使用虚拟属性来简化:
<h1>Register</h1>
<% form_for :user, :url => users_path do |f| %>
  <p>
    Full Name<br/>
    <%= f.text_field :full_name %>
  </p>
  <p>
    Password<br/>
    <%= f.password_field :password %>
  </p>
  <p>
    <%= submit_tag 'Register' %>
  </p>
<% end %>

这样,我们输入Full Name而不是分别输入first_name和last_name,我们需要修改User类:
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

通过虚拟一个full_name属性来简化工作,当然,这需要确保用户输入的full_name中有空格:
def validate
  validate.errors.add(:full_name, 'must have a space') unless full_name.include? ' '
end
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics