我有一些显示一个类别的show动作。但是从那里我想通过链接创建新产品。重点是我通过link_to传递了类别ID和名称。
很顺利,它会打开产品/新动作。在浏览栏中有这样的链接http://mysite/products/new?id=43&name=Skeleji
。没关系。
但是,如何在表格中提供这些ID和名称,我在哪里填写有关新产品的信息? 在此之后,当我点击创建时,我希望theese值这样的category_id与其他信息产品一起保存在db中。
之间,产品和类别我建立了关系。
到目前为止,我的代码看起来像这样。
我的类别/节目动作代码如下所示。
<%= link_to "Add Product", {:controller => "products", :action => "new", :id => @category.id, :name => @category.name }%>
产品控制器,新动作如下所示。
def new
@product = Product.new
@product.category_id = @category.id
end
单击“创建”会创建项目,但不包含category_id。哪里可能是问题? 也许代码什么是新行动,实际上应该是在创建行动。大约一年前,我设法做了这件事,但我找不到那个项目。:(
答案 0 :(得分:5)
您应该只需在new
操作中设置值:
def new
@product = Product.new
@product.category_id = params[:id]
@product.name = params[:name]
end
然后它们将以您的形式出现。
但我认为调用参数id
不是一个好主意,因为它是资源路由的默认参数名称。 params[:id]
中的ProductsController
通常应始终引用Product
对象。碰巧的是,你在new
动作中使用它,在正常使用中它将永远不会收到id
参数,所以我怀疑你会遇到任何麻烦,但它不是很语义。
如果您让Product
接受Category
的嵌套属性,那么我认为您可以做到:
@product = Product.new(params[:product])
如果您构建了像:product => { :name => "whatever", :category_attributes => { :id => 1 } }
这样的参数,但根据您的需要,这可能是过度的。
答案 1 :(得分:2)
您是否尝试过@product.category_id = params[:id]
通常,网址中的?
包含params
变量。