0

在我的新视图中,我有两种形式,一种是针对产品的,另一种是针对照片的。当我上传带有 select.file 字段的照片时,这些是由文件 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”行,我知道这不是正确的解决方案,因为当我尝试编辑操作时,当我尝试创建新对象时,它会转到最后一个产品而不是实际的编辑产品。

如何在我的新操作中找到当前产品???

非常感谢。

4

2 回答 2

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)对数据库进行更改。

于 2012-10-30T21:08:10.467 回答
0

通常,您所做的事情很尴尬,并且可能不是使用控制器新操作的最佳方式。

要回答您的问题,您需要在参数中传递产品的 ID。

根据您提交绘画表单的方式,您需要在请求正文或 url 中添加参数。这样你就可以做类似的事情

绘画控制器

def create
  @product = Product.find(params[:product_id]
  @painting = @product.paintings.create(params[:painting])
end

如果您添加视图/表单的代码片段,我可能会更好地帮助您。

于 2012-10-30T20:30:03.007 回答