Ruby on rails Rails-创建操作失败

Ruby on rails Rails-创建操作失败,ruby-on-rails,Ruby On Rails,我被这件事难住了。在以前的提交中,提交特定模型的新记录的表单工作得非常好,但我一定是在提交过程中做了一些事情,把它搞砸了,因为现在每当我提交表单时,我的控制器只是呈现“新建”动作 验证都通过了,但由于某种原因,记录没有保存 我在开发过程中没有编写测试,我现在很后悔,因为我要回去编写它们 但由于我是rails新手,我只想问一下调试这个的最佳方法是什么。我试图查看我的本地服务器日志,但它没有提供任何帮助。我的控制器的创建操作如下: def create @product = Product.

我被这件事难住了。在以前的提交中,提交特定模型的新记录的表单工作得非常好,但我一定是在提交过程中做了一些事情,把它搞砸了,因为现在每当我提交表单时,我的控制器只是呈现“新建”动作

验证都通过了,但由于某种原因,记录没有保存

我在开发过程中没有编写测试,我现在很后悔,因为我要回去编写它们

但由于我是rails新手,我只想问一下调试这个的最佳方法是什么。我试图查看我的本地服务器日志,但它没有提供任何帮助。我的控制器的创建操作如下:

def create
    @product = Product.find(params[:product_id])
    @review = @product.reviews.new(params[:review])
    current_user.reviews << @review
    if @review.save
        flash[:notice] = "Successfully created review."
        redirect_to current_user
    else
        render :action => 'new'
    end
end
def创建
@product=product.find(参数[:product\u id])
@review=@product.reviews.new(参数[:review])
当前用户评论“新增”
结束
结束
抱歉,这太模糊了(如果是,我将删除该问题)


还需要注意的是,我的所有模型现在都没有保存,因此这似乎是一个应用程序范围内的问题,因为它们都在较早的提交中工作。

1.如果您希望在审阅时设置产品id,则您的产品应该是现有记录。如果没有,你可以简单地做

Review.new(params[:review])
而不是

@product = Product.new(params[:product])
@review = @product.reviews.new(params[:review])

2.current_user.reviews1.如果您希望在审查中设置产品id,则您的产品应为现有记录。如果没有,你可以简单地做

Review.new(params[:review])
而不是

@product = Product.new(params[:product])
@review = @product.reviews.new(params[:review])

2.current_user.reviews实例化新对象然后保存它的顺序不太正确

在保存之前,您不应将未提交的
@review
附加到当前用户的
审阅。您只应根据是否正确保存,有条件地附加审阅

实现您正在尝试的目标的方法类似于:

def create
    @product = Product.find(params[:product_id])
    @review = @product.reviews.build(params[:review])
    if @review.save
        current_user.reviews << @review
        flash[:notice] = "Successfully created review."
        redirect_to current_user
    else
        render :action => :new
    end
end

实例化新对象然后保存它的顺序不太正确

在保存之前,您不应将未提交的
@review
附加到当前用户的
审阅。您只应根据是否正确保存,有条件地附加审阅

实现您正在尝试的目标的方法类似于:

def create
    @product = Product.find(params[:product_id])
    @review = @product.reviews.build(params[:review])
    if @review.save
        current_user.reviews << @review
        flash[:notice] = "Successfully created review."
        redirect_to current_user
    else
        render :action => :new
    end
end

对于这样的调试,我推荐两个gem:
better\u errors
pry
。或者。最好两者都有

更好的错误 只需将其添加到您的GEM文件,即可完成:

group :development do
  gem 'better_errors'
  gem 'binding_of_caller'
end
在控制器中引发错误,您将在引发异常时被转储到IRB会话中。然后你可以随便看看,直接看看发生了什么

窥探

同样,只需安装gem:

宝石“撬轨”

然后重新启动服务器(直接使用
rails s
,乘客或工头可能会因此而出错),并呼叫
binding。从控制器中撬出

def create
    @product = Product.find(params[:product_id])
    @review = @product.reviews.new(params[:review])
    current_user.reviews << @review

    binding.pry # <---- You will get dumped right here
    if @review.save
        flash[:notice] = "Successfully created review."
        redirect_to current_user
    else
        render :action => 'new'
    end
end
def创建
@product=product.find(参数[:product\u id])
@review=@product.reviews.new(参数[:review])

current_user.reviews在调试类似的东西方面,我推荐两个宝石:
better_errors
pry
。或者。最好两者都有

更好的错误 只需将其添加到您的GEM文件,即可完成:

group :development do
  gem 'better_errors'
  gem 'binding_of_caller'
end
在控制器中引发错误,您将在引发异常时被转储到IRB会话中。然后你可以随便看看,直接看看发生了什么

窥探

同样,只需安装gem:

宝石“撬轨”

然后重新启动服务器(直接使用
rails s
,乘客或工头可能会因此而出错),并呼叫
binding。从控制器中撬出

def create
    @product = Product.find(params[:product_id])
    @review = @product.reviews.new(params[:review])
    current_user.reviews << @review

    binding.pry # <---- You will get dumped right here
    if @review.save
        flash[:notice] = "Successfully created review."
        redirect_to current_user
    else
        render :action => 'new'
    end
end
def创建
@product=product.find(参数[:product\u id])
@review=@product.reviews.new(参数[:review])

当前用户.reviews尝试
@product.save
而不是
@review.save
不确定您的问题是否只是重定向,但将\u重定向到root\u url而不是重定向到当前用户应该执行重定向。Cheerry
@product.save
而不是
@review.save
不确定您的问题是否只是重定向,但是将_重定向到root_url而不是重定向到当前_用户应该做重定向,这是关于你的第一点的错误。它应该是“查找”而不是“新建”。我正在将审查与现有产品关联。你是说我可以使用当前用户。评论你不能用
当前用户来替换
@review.save
。评论对不起,关于你的第一点,这是一个输入错误。它应该是“查找”而不是“新建”。我正在将审查与现有产品关联。你是说我可以使用当前用户。评论你不能替换
@review。用
当前用户保存
。评论谢谢,所有的回复都非常有用,因为我对整个调试过程都不熟悉很高兴听到!为了让其他读者受益,如果这些回答中的一个特别有助于解决问题的细节,你可能会考虑接受它的正确性。谢谢,所有的回答都非常有用,因为我对这整个调试过程都很熟悉。为了让其他读者受益,如果这些答案中的一个特别有助于解决问题的细节,你可能会考虑接受它是正确的。