【问题标题】:Get actual object Rails获取实际对象 Rails
【发布时间】:2012-10-20 06:21:48
【问题描述】:

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

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

非常感谢。

【问题讨论】:

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


    【解决方案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)对数据库进行更改。

    【讨论】:

    • 谢谢 Jesse,在我的新视图中,我有两种形式,一种用于产品,另一种用于绘画,所以当我上传带有 file.field 字段的绘画时,我通过 Ajax 请求创建绘画在那个“新视图”上显示它。我怎样才能将那些新画与当前的产品对象联系起来???非常感谢。
    • 您现在谈论的是嵌套资源(因为绘画属于产品)。查看guides.rubyonrails.org/routing.html#nested-resourcesrailscasts.com/episodes/139-nested-resources
    • 嗨,Jesse,但在我的项目中,我在同一个视图中有两个表单,请查看 gist.github.com/3982996,谢谢。
    • @JulioAhuactzin 我的建议立场 --- 可能将您的问题简化为相关且可读的内容。
    【解决方案2】:

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

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

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

    绘画控制器

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

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

    【讨论】:

    • 我已经尝试过了,但它会带来一个错误日志,例如:找不到没有 ID 的产品。当我在我的新视图中时,已经有一个像这样的空对象:[["color", nil], ["created_at", Tue, 30 Oct 2012 20:36:11 UTC +00:00], [" description", nil], ["material", nil], ["picture", nil], ["quantity", nil], ["refund_policy", nil], ["size", nil], ["title" , nil], ["updated_at", Tue, 30 Oct 2012 20:36:11 UTC +00:00], ["user_id", 2]], 它有 user_id 和 Product.id,我想用那个Product.id 在我的绘画控制器中。
    • 如果不查看您的视图代码,我将无法帮助您。您使用产品和绘画模型的工作流程到底是什么?您创建一个产品,然后添加一幅画?您可以做的不是调用绘画控制器来创建产品的绘画,而是在产品绘画的创建动作中创建它。
    • 当您在新视图中时,有一个产品表单和一个用于添加绘画的 select.field 字段,因此当您上传照片时,这些是由 Ajax 请求自动创建的,所以我需要为这些对象添加和 ID,这就是为什么我认为我可以在使用 nil 参数之前创建和对象并将绘画添加到该对象。
    • 再一次,如果您希望我进一步帮助您,我需要查看您的视图代码
    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2011-10-29
    • 2013-12-22
    相关资源
    最近更新 更多