所以当我将collection_select附加到我的form_for对象时,我遇到了一个错误,如下所示:
<%= f.collection_select(:city_id, @cities, :id, :name, {:prompt => "Select a City"}, {:id => 'cities_select', multiple: true}) %>
和得到错误:
undefined local variable 'city_id'
但是当我不像这样绑定选择时:
<%= collection_select(nil, :city_id, @cities, :id, :name, {:prompt => "Select a City"}, {:id => 'cities_select', multiple: true}) %>
工作正常
我只是想了解为什么一个有效而另一个不起作用背后的理论?
我认为让你困惑的,主要是你对这里发生的事情的概念。
Nothing通过调用form helper对象上的方法将任何东西"绑定"到任何东西。有一些表单帮助器方法,如collection_select
,可用于构建HTML元素。有一些表单构建器具有方法,例如collection_select
,可以为绑定到对象的表单构建HTML表单元素。
您在这里遇到的问题是FormOptionsHelper#collection_select
方法和FormBuilder#collection_select
方法不是相同的方法,并且不接受相同的参数:
FormOptionsHelper#collection_select vs FormBuilder#collection_select
特别注意所提供的参数。同样值得注意的是,FormBuilder
实际上是将这项工作委托给模板(即FormOptionsHelper
),并根据需要调整参数。