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にはゲッターセッターがある
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」とかで確認しているけど値が入ってこないのが悩みどころ。
試行錯誤で変なコードが残っているとうまく動かない。