2016-05-17 13 views
0

私は、フォームがそのサイトからサブミットされた後、バリデーションエラーメッセージを別のサイトに送信するレールアプリケーションを持っています。railsはajaxレスポンスでバリデーション属性名を変更します

私はカスタマイズする必要があるたくさんの列を持っていますが、今のところ私は正しく動作するようにしようとしています。私はen.ymlを変更して動作させようとしています。

#config/locales/en.yml 

en: 
    activerecord: 
    attributes: 
     message: 
     msg_from_name: 
      one: "Your Name" 

メッセージモデルで検証が呼び出されています。

#app/models/message.rb 

class Message < ActiveRecord::Base 
    validates :msg_from_name, length: { minimum: 3, maximum: 20 } 
end 

msg_from_nameが検証されたときに今、それが返されます。
私が取得しようとしている何

「msg_from_nameは(最小は3つの文字である)短すぎる」です:
「あなたの名前があります短すぎます(最小は3文字です)。

検証中に、外部サイトに送信する属性名を変更するにはどうすればよいですか?私がしようとすると、 Ref

#config/locales/en.yml 
en: 
    activerecord: 
    attributes: 
     message: 
     msg_from_name: "Your Name" 

そして:

#app/models/message.rb 

class Message < ActiveRecord::Base 
    validates :msg_from_name, length: { minimum: 3, maximum: 20 } 

    HUMANIZED_ATTRIBUTES = { 
    :msg_from_name => "First Name" 
    } 

    #Rails 4 
    def self.human_attribute_name(attr, options = {}) 
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super 
    end 
end 

私は再び同じ出力を得る

はまだ機能していないコメントから変更を更新しました。私が使用している構文がビューにのみ適用されるか、ビューに必要なコードが、外部サイトにajaxでエラーとして送信されるものと異なるかどうかはわかりません。

+0

http://stackoverflow.com/questions/5785503/change-error-field-name-in-rails –

+0

@pitabasprathal質問を更新しました – jtlindsey

答えて

0

ajaxを別のサイトに送り返してもローカルビューで動作する理由はわかりませんが、私は次のように問題を解決しました。

外部サイトのクライアント側は、すでにresponse.statusresponse.statusTextでHTTPステータスエラー(400,402,500など)をキャッチしている可能性があります。私はそれらをハッシュerrors[:codeErrors]にプッシュして、検証エラーを送信し、失敗した検証メッセージの配列を構築していました。クライアントはresponse.responseJSON.codeErrorsでアクセスできます。コード例:

//external sites clientform.js 
    ... 
    $.ajax({ 
    method: "POST", 
    url: '//example.com/page', //target url 
    data: $('#contact-form').serialize(), 
    dataType: "json", 
    success: function(response) { 
     // ... 
    }, 
    error: function(response) { 
     console.log("Error: " + response.status + ", Message: " + response.statusText) 
     // Custom server errors 
     var msg = response.responseJSON.codeErrors; 
     console.log("There are " + msg.length + " validation errors:") 
     for(i = 0; i < msg.length; i++) console.log(msg[i]); 
    } 
    }); 
    e.preventDefault(); 
    ... 

だから私は、クライアントへのAjaxのレスポンスを送信する前に、各文字列内のテキストを置き換え:

# rails controller 
... 
errors[:codeErrors].each do |text| 
    text.sub! 'msg_from_site', 'Form Origin' 
    text.sub! 'msg_from_name', 'Your Name' 
    text.sub! 'msg_from_ipaddress', 'IP Error' 
    # ...etc 
end 

render status: statusCode, json: errors 
... 

私はこれが最善の方法ではありません確信しているが、それは唯一の方法です私は仕事をすることができました。

関連する問題