Rails在ajax响应

时间:2016-05-17 16:25:25

标签: ruby-on-rails ajax validation

我有一个rails应用程序,在从该站点提交表单后,将验证错误消息发送到另一个站点。

我有很多我需要自定义的列但是现在我只是想让一个正常工作。我试图通过改变en.yml来实现它。

#config/locales/en.yml

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

正在Message模型上调用验证。

#app/models/message.rb

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

现在,当msg_from_name被验证时,它返回:
&#34; msg_from_name太短(最少3个字符)&#34;

我想要得到的是:
&#34;你的名字太短(最少3个字符)&#34;

如何在验证期间更改rails发送到外部站点的属性名称?

更新了更改了仍无效的评论: 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中的错误发送到外部站点的代码不同。

1 个答案:

答案 0 :(得分: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
...

我确定这不是最好的方式,但这是我开展工作的唯一方式。