我在新视图中有两种形式,一种是产品,另一种是照片。 当我使用select.file字段上传fotos时,这些是由文件create.js.erb通过Ajax调用创建的,然后当我将其他字段填充到产品时,我还有另一个按钮来创建它。所以我有两种形式和一种方法来创建每种形式。
问题是ID,我发现解决方案是在用户进入新视图之前创建一个对象,所以我有这个代码:
产品的控制器:
def new
@product = current_user.products.create
end
它创建了一个对象nil,现在我可以创建我的Foto到该对象,如下所示:
绘画的控制器:
def create
@product = Product.last
@painting = @product.paintings.create(params[:painting])
end
问题是“@product = Product.last”这一行,我知道这不是正确的解决方案,因为当我尝试编辑操作时,当我尝试创建新对象时,它会转到最后一个产品而不是实际的编辑产品。
如何在我的新动作中找到当前产品???
非常感谢。
答案 0 :(得分:1)
构建一个新对象(真正显示新表单,因为#new是一个GET请求,不应该进行破坏性更改)
def new
@product = current_user.products.build
end
创建新对象
def create
@product = current_user.products.build(params[:product])
if @product.save
redirect_to @product
else
render :new
end
end
显示对象的编辑表单
def edit
@product = current_user.products.find(params[:id])
end
更新现有产品
def update
@product = current_user.products.find(params[:id])
if @product.update_attributes(params[:product])
redirect_to @product
else
render :edit
end
end
你会注意到GET请求(新的和编辑的)对数据库没有任何挑衅。
对(更新/创建)的两个破坏性请求(PUT和POST)对数据库进行了更改。
答案 1 :(得分:0)
你一般做的事情很尴尬,可能不是使用控制器新动作的最佳方式。
要回答您的问题,您需要在参数中传递产品的ID。
根据您提交绘画表单的方式,您需要在请求正文或网址中添加参数。这样你就能做到像
这样的事情绘画的控制器
def create
@product = Product.find(params[:product_id]
@painting = @product.paintings.create(params[:painting])
end
如果你添加了你的观点/表格的代码片段,我可能会更好地帮助你。