将表单返回的对象保存到数据库中?

时间:2013-12-12 13:32:08

标签: ruby-on-rails ruby

如何通过表单填充数据后,如何将对象保存到数据库?

这些是我的控制器操作:

def new
  @product= Product.new
end

def create
  ......
  if @product.save
    redirect_to @product
  else
    render 'new'
  end
end

params[:product]是我要保存的对象,例如:

params[:product].save

但这不起作用。

如果没有创建新产品并逐个设置其字段,有没有办法做到这一点:

def create
  @product= Product.new
  @product.category_id = params[:product][:category_id]
   ...
  if @product.save
    redirect_to @product
  else
    render 'new'
  end
end

此外,从结尾的重定向似乎不起作用,它说:

NoMethodError in Admin::ProductsController#create
undefined method `product_url' for #<Admin::ProductsController:0x007fea5c8c86f8>

4 个答案:

答案 0 :(得分:2)

这是非常简单的东西,你可以一次性将所有形式的参数传递给新对象:

def create
  @product = Product.new(product_params)

  if @product.save
    redirect_to products_url # Since you don't want to show the product, back to list
  else
    render 'new'
  end
end

def product_params 
  params.require(:product).permit(:category_id, ...) # Add any other attribute names from your form
end

如果保存失败,则会有一个errors数组,您可以在new页面上输出。

我建议您查看scaffolds and generators,因为他们会为您构建所有代码。

答案 1 :(得分:1)

如果获得ActiveModel::ForbiddenAttributesError,则需要使用强参数:

def create
  @product = Product.new(product_parameters)
  # ...
end
# ...
private

def product_parameters
  params.require(:product).permit('list of permitted parameters')
end

答案 2 :(得分:0)

您可以将参数哈希值传递给new以立即设置所有参数。这样的事情应该有效

def create
  @product= Product.new(params[:product])
  if @product.save
    redirect_to @product
  else
    render 'new'
  end
end

答案 3 :(得分:0)

不,很明显,因为如果你能保存这个问题,你的网站安全性会有一个大洞(黑客)。您必须手动或半自动地解析params变量哈希,从params中裁剪id,然后查找,创建或更新记录。

例如在你的情况下,你应该这样做:

class ProductsController
  before_filter :find_category, :only => [ :create ]

  def create
    @product= Product.new params
    @product.category = @category
    ...
    if @product.save
      redirect_to @product
    else
      render 'new'
    end
  end

private

  def find_category
    @category = Category.find_by_id params[:product][:category_id]
  end

end

当然,你要保护你的搜索机制免于将无效ID传递给。