2010-04-20 62 views
1

我试图创建一个使用collection_select方法<选择>元素,但似乎为了正确<选项>被选中,标识传入collection_select需要成为一个实例变量而不是局部变量(这是部分发生的)。Ruby on Rails的:如何使用局部变量在collection_select

所以,当我创建一个productcategories一个<选择>,适当的类别不是默认选择。

_product_row.erb(不工作):

My product: <%= product.name %> 
<%= collection_select(:product, :category_id, @current_user.categories, :id, :name, options = {:prompt => "-- Select a category --"}) %> 

截图:

alt text http://img534.imageshack.us/img534/8929/screenshot20100421at120.png

我发现,我能得到它的手之前声明的实例变量的工作,但这对我来说似乎是一个巨大的破绽。

_product_row.erb(工程):

<% @product_select_tmp = product %> 
<%= collection_select(:product_select_tmp, :category_id, @current_user.categories, :id, :name, options = {:prompt => "-- Select a category --"}) %> 

截图:

alt text http://img534.imageshack.us/img534/1958/screenshot20100421at120l.png

因为这部分是迭代的产品的集合,我不能只是还@product中声明控制器(IOW,除非我丢失了某些东西,产品必须是是这个部分的局部变量)。

那么如何在调用局部变量时获得collection_select来选择适当的项目?

回答

2

您是否尝试过通过在选项哈希:selected关键?如果您提供当前的product.id,它应该按照您的预期行事。

<%= collection_select(:product, :category_id, @current_user.categories, :id, :name, {:prompt => "-- Select a category --", :selected => product.category.id}) %>

+0

我想加上这个,因为它自己的答案,因为最后一个似乎是有用的内部和外部本身,尽管不是你正在寻找的东西。 – 2010-04-21 17:25:27

+0

再次感谢达米安,这似乎已经做到了,尽管它应该是:selected => product.category.id。如果您更新了答案,我会将其标记为已接受。值得注意的是:在这种情况下,下拉列表中仍然会出现:prompt选项(如果您在我的问题中使用第二个示例中的方法,那么rails足够聪明,可以让它远离选项),但我可以忍受:) – mmacaulay 2010-04-21 17:56:52

+0

完成并完成。快乐的编码。 – 2010-04-21 18:09:04

1

你可以通过集合到泛音,并指定一个局部变量来他们通过为:

<%= render :partial => "products/product_row", :collection => @products, :as => :products %> 

相关文章:http://apidock.com/rails/ActionView/Partials

+0

谢谢......但这并不能真正解决问题。 – mmacaulay 2010-04-20 20:11:57

+0

你想要一种获得实例变量'@ products'而不必明确声明它的方法,对吗?通过'render:partial ...:collection => @ collection'传递所需的集合应该可以做到这一点。无论如何,如果您希望在每个产品表格行中有一个下拉列表,您将需要整个集合。或者我误解了这个问题? – 2010-04-20 20:42:00

+0

不,我希望能够用_local_变量调用collection_select,而不是实例变量,并在生成的HTML中选择正确的选项。对不起,我意识到这个问题有点令人困惑。也许我会试着重新说一遍。 – mmacaulay 2010-04-21 00:14:17