如何通过表单填充数据后,如何将对象保存到数据库?
这些是我的控制器操作:
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>
答案 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传递给。