- ベストアンサー
Ruby on Railsの移行でモデルのバリデーションが動作しない不具合が発生
- 初心者がRuby on Railsで開発をしている際に、本番環境への移行後にモデルのバリデーションが正常に動作しないという不具合が発生しています。
- 移行方法としては、本番環境でrailsコマンドを実行した後、必要なファイルを全てコピーする必要があります。
- 不具合としては、時々「unknown action」のエラーが発生したり、モデルのバリデーションが正常に動作しないという問題が報告されています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#3です。 #2さんの回答を見て思い出したのですが、 validates_*_of 系はデフォルトで hoge.save時に呼ばれるようになっています。 ですので、私の想像が正しければ今回の件は以下のような対応で治ります。 (#2で答えた方法だと問題アリでした…) [誤]------------------------------------------------- validates_presence_of :day, :timeZone, :message => "は必須入力です" [正]------------------------------------------------- validates_presence_of :day, :timeZone, :message => "は必須入力です", :on =>[:save, :create, :update] ----------------------------------------------------- create時だろうがupdate時だろうが hoge.saveを使えば良い話ではあるのかもしれませんが、 うちの環境ではpostgreSQLでdumpとrestoreすると hoge.saveでcreateした時にエラーが出たので hoge.createにした覚えがあります…… >#2さんへ 恐らく、質問者さんは script/generate scaffold を使っており、拡張にActiveHeartsを入れているのではないかと思います。
その他の回答 (4)
- dekopa-
- ベストアンサー率42% (161/378)
#2です。 #3さんの回答をみて気づいたんですが、#2の回答でupされたコードと内容、なんだかおかしいですね… >編集などeditではvalidationが動作するのに新規のnewだと動作しません。 validateが起きるのはsaveが呼ばれた時です。 http://d.hatena.ne.jp/keyword/Agile%20Web%20Development%20with%20Rails は読んでいますか?保存時にafter_やbefore_やvalidateが呼ばれる順番が書いてあるのですが。 def createやdef updateで、saveが呼ばれたときにvalidateが呼ばれるかどうか確認してください。 呼ばれるなら、それが正常です。 こちらの勘違いなら、せめてソースをひと揃い晒してください。
- toubanzyan
- ベストアンサー率100% (1/1)
2番目の件についてです。 同じ状態になったので色々と検証してみたのですが、 新規作成時に使用するのは hoge.createまたはhoge.save で、 修正時に使用するのは hoge.updateまたはhoge.save が一般的かと思います。 自分の場合も新規作成時にエラーが出たので hoge.createと書いていた部分を全てhoge.saveに書き換えたら 問題なくvalidationが動くようになりました。 # 何らかの条件下で、ActiveRecordのvalidates_*_ofが # create時に実行されないのかもしれないです。 # バージョンの問題なのか環境の問題なのかは謎。 一度、gem listで、新旧両方の環境にインストールされている リストを出して、バージョンを比較されてみるといいかもしれません。
- dekopa-
- ベストアンサー率42% (161/378)
validateが動く物とそうでない物の差を、ちょっとずつ検証していくしか無いかも。 ここにコードは上げられないですよね? >後は、開発モードに依存する書き方をしていないか、とか 以前ひっかかったのが、developmentだと動くのにproductionだと動かない、というものです。 developmentは毎回リクエスト毎にロードされるので、変数値が初期化されます。それを前提としたコードが混じっていたのが原因です。 validationが動かない、というのは、呼ばれても正常に検証しないのですか?それとも、呼ばれもしないのですか? 正常動作するモデルとそうでないモデルの差を、順に検証してください。
補足
とても返信遅くなりまして申し訳ございません。 developmentに戻しても動作しません。。。 validationは呼ばれもしません。 不思議な事がおきました。 編集などeditではvalidationが動作するのに新規のnewだと動作しません。 いったいどういった順序でvalidationがよばれるのでしょうか? かなり謎です。 コードの問題とは考えづらいのですが。 <model> class Hoge < ActiveRecord::Base set_field_names :name=> '名前' validates_presence_of :day, :timeZone, :message => "は必須入力です" end <cont> class HogeController < ApplicationController def new @hoge = Hoge.new end def edit @hoge = Hoge.new end end すごく初心者な質問なのですが、 viewからどういった順序でmodelが呼ばれるのでしょうか?
- dekopa-
- ベストアンサー率42% (161/378)
基本的に、ファイルの移行だけで動くはずですが。他が同じなら。 1.railsのインストールはできているか?(gemは実行した?) 2.OS環境は一緒か?(パスやコードセットなど) 3.DBは作成済みか。バージョンは一緒か、コードセットは一緒か。 後は、開発モードに依存する書き方をしていないか、とか
補足
返信ありがとうございます。 1,2,3全てokです。 validateが動くものと動かないものがあり大変困っています。
お礼
すっかりあきらめていました。 今更ですがやってみます。 ありがとうございます。