おれの備忘録

Ruby on Rails とか、iPhoneアプリとか。

railsのvirtual attributeのお話

railsのform_forを使っていて、データベースとはひもづいていないattributeを持ちたいと思ったんだけど、どうしていいかわからないので、いろいろ調べてみたらvirtual attributeというのがあるらしい。
参考:
RailsCast(http://railscasts.com/episodes/16-virtual-attributes?view=asciicast)

例えば、Userというモデルがあったとして、

:name, :email

みたいなデータベースにひもづいたattributeがあったとする。

で、何かのフォームで

<% form_for (@user, :url => user_create_path, :method => :post) do |f| %>
  <% f.text_field :name %>
  <% f.text_field :email %>
<% end %>

のようにUserをつくるフォームがあったとして。

今回だけはたまたまユーザーの携帯電話番号がほしいとか、あるいは何かのフラグをたてたいと思ったときに、

  <% f.text_field :tel %>

上記のように追加してもエラーがでてしまう。Userのフィールドにtelというものがないからだ。

こういったときはvirtual_attributeを使う。
使い方は簡単。
Userモデルに下記を追加する。

class User < ActiveRecord::Base

attr_accessor :tel

これでform_forで:telというattributeが使えるようになる。

ここも参考に。
stackoverflow(http://stackoverflow.com/questions/3327265/rails-using-form-fields-that-are-unassociated-with-a-model-in-validations)