渲染 json 未显示在 rails 4 的视图中

Posted

技术标签:

【中文标题】渲染 json 未显示在 rails 4 的视图中【英文标题】:render json not showing up in view on rails 4 【发布时间】:2015-04-25 22:27:41 【问题描述】:

我有一个表单设置为(远程:true 以通过 ajax 提交),用户可以在其中输入他们的电子邮件和邮政编码。如果记录被模型验证并成功保存,它会触发一个 javascript 脚本,相应地更改 dom 以通知用户成功。但是,如果记录没有通过验证,我想通过 json 从服务器返回错误并将它们显示在表单附近的 div 中。但是我不能让循环的“其他”部分工作并让 json 在视图上呈现。

在 chrome 开发工具中,当我尝试提交空白表单时,我得到一个状态 200 并且响应是

"email":["is invalid"],"zip":["is not a number","is too short (minimum is 5 characters)"]" 

但是我怎样才能让这些从控制器返回的错误显示在视图中?

控制器---------------------------------------------- ->

class EngagesController < ApplicationController

  def now
    @sub = Subscriber.new
  end

  def create
    @sub = Subscriber.new(subscriber_params)

    respond_to do |format|
      if @sub.save
        format.html  render 'now', notice: 'User was successfully created.'     
        format.js   
      else
        format.json  render :json => @sub.errors 
      end
    end
  end      


private
  def subscriber_params
    params.require(:engage).permit(:email, :zip)
  end

end

型号---------------------------------------------- ------>

class Subscriber < ActiveRecord::Base

  validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]    2,)\z/i
  validates :zip, numericality: only_integer: true, length: minimum: 5

end

【问题讨论】:

期待js.erb的东西。 【参考方案1】:

不要渲染json,而是使用

format.js render 'errors', errors: @subs.errors

您需要编写名为 errors.js.erb 的视图文件,您将在其中使用 JavaScript 代码显示错误。

【讨论】:

谢谢,我尝试按照您的建议创建 error.js.erb 并且它正在运行 error.js.erb 但是我无法显示实际的错误消息。例如,在 error.js.erb 中,我有以下代码,“$('#subs').append("")”我从服务器得到响应,“$ ('#subs').append("#<ActiveModel::Errors:0x86b91b8>")" 模型验证失败后的错误信息存储在哪里?另外,在您写的答案中,“错误:@subs.errors”部分是做什么的?再次感谢 然后你需要使用 @sub.errors.full_messages 给你数组。只需循环并附加它。现在errors: @sub.errors 将传递变量errors 来查看文件。所以你可以直接在errors.js.erb中访问它,而不是像@sub.errors那样访问。您可以只使用错误变量。

以上是关于渲染 json 未显示在 rails 4 的视图中的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中,如何使用视图呈现 JSON?

在部分 Rails 4.0 中渲染表格

Rails 如何转义和显示渲染视图的内容

在没有模型对象 Rails 4 中覆盖渲染:json

渲染父 rails 4.0 的子节点

Rails:根据数据库条目决定在视图中渲染特定图像