获取实际对象Rails

时间:2012-10-30 20:20:00

标签: ruby-on-rails ruby ruby-on-rails-3 actionview

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

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

非常感谢。

2 个答案:

答案 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

如果你添加了你的观点/表格的代码片段,我可能会更好地帮助你。