Ruby on rails Rails-创建操作失败
我被这件事难住了。在以前的提交中,提交特定模型的新记录的表单工作得非常好,但我一定是在提交过程中做了一些事情,把它搞砸了,因为现在每当我提交表单时,我的控制器只是呈现“新建”动作 验证都通过了,但由于某种原因,记录没有保存 我在开发过程中没有编写测试,我现在很后悔,因为我要回去编写它们 但由于我是rails新手,我只想问一下调试这个的最佳方法是什么。我试图查看我的本地服务器日志,但它没有提供任何帮助。我的控制器的创建操作如下:Ruby on rails Rails-创建操作失败,ruby-on-rails,Ruby On Rails,我被这件事难住了。在以前的提交中,提交特定模型的新记录的表单工作得非常好,但我一定是在提交过程中做了一些事情,把它搞砸了,因为现在每当我提交表单时,我的控制器只是呈现“新建”动作 验证都通过了,但由于某种原因,记录没有保存 我在开发过程中没有编写测试,我现在很后悔,因为我要回去编写它们 但由于我是rails新手,我只想问一下调试这个的最佳方法是什么。我试图查看我的本地服务器日志,但它没有提供任何帮助。我的控制器的创建操作如下: def create @product = Product.
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。用当前用户保存。评论谢谢,所有的回复都非常有用,因为我对整个调试过程都不熟悉很高兴听到!为了让其他读者受益,如果这些回答中的一个特别有助于解决问题的细节,你可能会考虑接受它的正确性。谢谢,所有的回答都非常有用,因为我对这整个调试过程都很熟悉。为了让其他读者受益,如果这些答案中的一个特别有助于解决问题的细节,你可能会考虑接受它是正确的。