Ruby on rails Rails验证错误和多个模型,can';t将HashWithInferenceTaccess转换为字符串

Ruby on rails Rails验证错误和多个模型,can';t将HashWithInferenceTaccess转换为字符串,ruby-on-rails,Ruby On Rails,从1.2版左右开始,我就没有使用过rails,有些地方已经改变了。我遇到了一个问题,我试图保存一个空模型,以便使用以下命令获取属性上的验证错误:validates_presence_of,而我得到的错误是“无法将HashWithInferenceAccess转换为String”。我将尝试简化我的代码,以尽可能简洁地表达我的观点 我的模型: class Project < ActiveRecord::Base validates_presence_of :title, :descr

从1.2版左右开始,我就没有使用过rails,有些地方已经改变了。我遇到了一个问题,我试图保存一个空模型,以便使用以下命令获取属性上的验证错误:validates_presence_of,而我得到的错误是“无法将HashWithInferenceAccess转换为String”。我将尝试简化我的代码,以尽可能简洁地表达我的观点

我的模型:

class Project < ActiveRecord::Base

    validates_presence_of :title, :description
    validates_uniqueness_of :title

    has_one :address

    accepts_nested_attributes_for :address, :allow_destroy => true
end
有点长,对不起;)

尝试添加

@project.address.build
到你的控制器。您需要实例化address对象。

尝试添加

@project.address.build

到你的控制器。您需要实例化address对象。

跟踪不存在。你的第27行有问题。您发布的代码没有37行,但根据跟踪,我敢打赌是这一行。因为没有其他人有'+'。如果有一个隐式+的话,它的调用者就会列在跟踪中

 flash[:notice] = @project.title + ' successfully created'
奇怪的是,基于你的验证,它达到了那个点。验证“”的存在性“”应在为nil、false或“”的属性上添加错误。在控制台中运行时,验证是否如预期的那样失败

这是一个控制台友好的代码版本,可用于跟踪您的问题。您应该能够将其粘贴到控制台中,以帮助跟踪您的问题

params = {
  "project"=> {
    "title"=>"", "notes"=>"","description"=>"", 
    "address_attributes"=>{
      "city"=>"", "zip"=>"","title"=>"","country"=>"",
      "suite"=>"","street"=>"","state"=>""
    }
   }
flash = {}

@project = Project.new(params[:project])
if @project.save
  flash[:notice] = @project.title + ' successfully created'
  puts "Saved. Flash: #{flash[:notice]}"
else
  puts "validations failed:" 
  puts @project.errors.full_messages.map{|m| "\t#{m}"}.join("\n")
end

痕迹不存在。你的第27行有问题。您发布的代码没有37行,但根据跟踪,我敢打赌是这一行。因为没有其他人有'+'。如果有一个隐式+的话,它的调用者就会列在跟踪中

 flash[:notice] = @project.title + ' successfully created'
奇怪的是,基于你的验证,它达到了那个点。验证“”的存在性“”应在为nil、false或“”的属性上添加错误。在控制台中运行时,验证是否如预期的那样失败

这是一个控制台友好的代码版本,可用于跟踪您的问题。您应该能够将其粘贴到控制台中,以帮助跟踪您的问题

params = {
  "project"=> {
    "title"=>"", "notes"=>"","description"=>"", 
    "address_attributes"=>{
      "city"=>"", "zip"=>"","title"=>"","country"=>"",
      "suite"=>"","street"=>"","state"=>""
    }
   }
flash = {}

@project = Project.new(params[:project])
if @project.save
  flash[:notice] = @project.title + ' successfully created'
  puts "Saved. Flash: #{flash[:notice]}"
else
  puts "validations failed:" 
  puts @project.errors.full_messages.map{|m| "\t#{m}"}.join("\n")
end

一切看起来都是正确的。你能发布错误的堆栈跟踪吗?它应该会让你知道到底是什么失败了。谢谢你看它,我按照你的建议查看了堆栈跟踪,但没有多大成功。我已将其添加到我的问题主体中,以供大家看到。所有内容看起来都是正确的。你能发布错误的堆栈跟踪吗?它应该会让你知道到底是什么失败了。谢谢你看它,我按照你的建议查看了堆栈跟踪,但没有多大成功。我已将其添加到我的问题主体中,以供大家查看。问题不在于实例化地址,正如我上面提到的,代码在最佳情况下工作顺利,仅在我尝试为必填字段传递空字符串时失败。当项目标题为空时,您的“+”似乎导致了问题。尝试从您的flash消息中删除它,现在只需要一个基本的“已创建”字符串。flash消息中的“+”永远不会被命中,因为该模型从未成功创建,@project.save将返回false,如果它达到了这个程度。我还相信项目标题是作为一个空字符串传递的,而不是nil。控制器中的第27行是什么?你有没有试着把它评论出来?哈哈,那太尴尬了。为了简单起见,我删去了“else”逻辑中的有罪代码。谢谢你的现实检查!问题不在于实例化地址,正如我上面提到的,代码在最佳情况下运行良好,只有在我尝试为必填字段传递空字符串时才会失败。当项目标题为null时,您的“+”似乎导致了问题。尝试从您的flash消息中删除它,现在只需要一个基本的“已创建”字符串。flash消息中的“+”永远不会被命中,因为该模型从未成功创建,@project.save将返回false,如果它达到了这个程度。我还相信项目标题是作为一个空字符串传递的,而不是nil。控制器中的第27行是什么?你有没有试着把它评论出来?哈哈,那太尴尬了。为了简单起见,我删去了“else”逻辑中的有罪代码。谢谢你的现实检查!是的,我发现这实际上是我在第27行的一个巨大疏忽,试图“+”一些根本不存在的东西。非常感谢您的回复,我只是还不太习惯调试rails的东西。是的,我在第27行发现这实际上是我的一个巨大疏忽,试图“+”一些根本不存在的东西。非常感谢您的回复,我只是还不太习惯调试rails的东西。
params = {
  "project"=> {
    "title"=>"", "notes"=>"","description"=>"", 
    "address_attributes"=>{
      "city"=>"", "zip"=>"","title"=>"","country"=>"",
      "suite"=>"","street"=>"","state"=>""
    }
   }
flash = {}

@project = Project.new(params[:project])
if @project.save
  flash[:notice] = @project.title + ' successfully created'
  puts "Saved. Flash: #{flash[:notice]}"
else
  puts "validations failed:" 
  puts @project.errors.full_messages.map{|m| "\t#{m}"}.join("\n")
end