通过link_to,rails将show参数从show action传递给新操作

时间:2013-03-26 13:29:41

标签: ruby-on-rails parameters link-to

我有一些显示一个类别的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。哪里可能是问题? 也许代码什么是新行动,实际上应该是在创建行动。大约一年前,我设法做了这件事,但我找不到那个项目。:(

2 个答案:

答案 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变量。