modelに該当しないフィールドの値検証

無茶な書き方だとテーブルのカラム(=model)に該当しないform_tagの値とかを検証したい。

今回は1件のフィールドで悩んでいます。

app/models/hoge.rbの中ではparamsの利用ができないので悩む。

失敗例

コントローラーでnewやeditするときに無理やり追加する

def new
  @hoge = Hoge.new
 add_param
end

def create
  temp=params[:hoge].delete("add_data")
  @hoge=Hoge.new(params[:hoge])
  if @hoge.save
    redirect_to :action=>:show, id=>@hoge
  else
    @hoge["add_data"]=temp
    rendeer :action=>:new
  end
end

private
def add_param
  @hoge["add_data"]=nil
end

views

<%= f.text_field :add_data %>

モデルで利用できるように宣言する

class Hoge < ActiveRecord::Base
  attr_accessible :add_data
  validates :add_data, :presence =>true

制限を加えるとエラーになる、、、
undefined method `add_data'

煮詰まってしまったのでこのやり方は止める。
コントローラでparamsを使って制限とか検証とかすることにしよう。

検証中

「姓 名」と一つのフィールドに空白区切りで入力してもらってモデルでは分けて保存するとき
16 Virtual Attributes

ゲッターやセッターと呼ばれるものを使うと良いらしい
Railsにおけるアクセサ定義系メソッドのまとめ

モデルで利用できるように宣言する

class Hoge < ActiveRecord::Base
#getter  
def add_data
  @add_data
end

#setter
def add_data=(value)
  @add_data=value
end

views

<%= f.text_field :add_data %>

使えた!!!!

validatesも使えたのでコントローラに渡す前にモデルの中で検証することが出来る!!!!!いまさらながら嬉しい!!!

rubyにはゲッターセッターがある

Rails3を初歩から学ぶ#4 モデル向けのテストをつくる

class User < ActiveRecord::Base
attr_accessor :password
まず1行目の「attr_accessor」ですが、これはRailsではなくRubyの仕様で、渡したパラメータのgetterとsetterを生成してくれるメソッドです。
モデル生成時に指定したフィールドはActiveModelが自動で生成してくれますが、passwordフィールドは生成していません(何度も言いますがDBに格納するのは暗号化した「encrypted_password」です)。なのでここでpasswordというフィールドを定義しているわけです。

そんなのあったなーってな感じで設定すると動いた。

今回の正解

モデルで利用できるように宣言する

class Hoge < ActiveRecord::Base
  attr_accessor :add_data
  attr_accessible :add_data
  validates :add_data, :条件

検証しているときに「pp」とかで確認しているけど値が入ってこないのが悩みどころ。
試行錯誤で変なコードが残っているとうまく動かない。