###前提・実現したいこと
railsで記事投稿システムを作っているのですが、記事の各項目の必須項目をバリデーションでチェックしたい思っています。そこで以下のように考えました。
- javascriptでクライアントサイドで検証
- railsのモデル単位での検証(jsが効かない環境のための検証)
実際に書いてみたのですが、エラーが出ても共存ができないです。
###実際のコード
javascript側の検証のコードです。erbにname属性を付けてチェックします。
page_new.js $(function(){ /* var methods = { URL: function(value, element){ return this.optional(element) || /^\d{11}$|^\d{3}-\d{4}-\d{4}$/.test(value); } }; $.each(methods, function(key) { $.validator.addMethod(key, this); }); var rules = { URL: "URL" }; */ //入力項目ごとのエラーメッセージ定義 var messages = { タイトル: { required: "「タイトル」を入力してください" }, サムネイル: { required: "「サムネイル画像」を選択してください" }, URL: { required: "「動画URL」を入力してください" } }; $(function(){ $('#new_article').validate({ //rules: rules, messages: messages, //エラーメッセージ出力箇所調整 errorPlacement: function(error, element){ error.insertAfter(element); } ,submitHandler: function(form) { //$("#thankyou").fadeIn(); form.submit(); } }); }); });
以下はモデルベースの検証です。
/models/article.rb require 'length_with_wide_char_validator' class Article < ActiveRecord::Base validates :image, presence: true validates :video_id, presence: true validates :title, presence: true, :length_with_wide_char => {:maximum => 70}
###発生している問題・エラーメッセージ
先のようにまずjs側で検証し、jsの効かない環境ではモデルベースの検証をすることによってからの記事を生成させないようにしようとしているのですが、以下のように投稿ができない状態になってしまいました。
エラーメッセージ NoMethodError in ArticlesController#create def validate_each(object, attribute, value) count = 0 value.split(//).each do |v| v.bytesize > 1 ? count += 2 : count += 1 end object.errors[attribute] << (options[:message] || "is too long (maximum is %d characters)" % options[:maximum]) if count > options[:maximum]
他にもjs側でエラーを出された後に入力してから投稿しようとすると値が入っているはずなのにモデル側でエラーが出てしまったりと上手くいきません。そもそも僕が考えているバリデーションの方式はrailsでは実現できないものなのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/21 08:06
2016/09/24 08:39 編集