Я не знаю точно, что является причиной вашей ошибки, но я могу сказать вам, что помощник check_box_tag
работает не так, как вы ожидаете. Из документации она определяется следующим образом:
check_box_tag(name, value = "1", checked = false, options = {})
Так что повторный вызов check_box_tag("area", "name")
просто даст вам <input id="area" name="area" type="checkbox" value="name" />
несколько раз. Обратите внимание, что атрибут «значение» (то есть значение, которое отправляется на ваш сервер при отправке этой формы) всегда является «именем», а не тем, что вы хотите!
Вместо этого попробуйте следующее:
<% Area.all.each do |a| %>
<%= check_box_tag("areas[]", a.id) %>
<%=h a.name %>
<% end %>
Вещи, которые я изменил:
- Я использовал
Area.all
вместо Area.find(:all)
- я сделал это по косметическим причинам, но в ответе DanneManne утверждается, что он устарел в Rails 3 (я бы не знал - я все еще на 2.3.8).
- Я использовал идентификатор области вместо ее имени в поле значения; всегда полезно искать информацию по идентификатору, если вы можете - идентификаторы являются целыми числами и сравниваются быстрее, чем строки, и в вашей базе данных всегда будет индекс для столбца идентификатора для сверхбыстрых поисков.
- И последний, но способ, что наиболее важно Я добавил
[]
после имени ввода. Это позволяет Rails собирать все значения, представленные с этим именем, в массив, а не просто брать последнее. Смотрите ниже:
Бросив URL ...
/whatever?a=3&a=17&a=12
... в приложении Rails выдает хэш параметров ...
{:a => 12}
... но URL ...
/whatever?a[]=3&a[]=17&a[]=12
... дает вам то, что вы хотите:
{:a => [3, 17, 12]}
И если у вас есть массив всех интересующих вас area_ids, вы можете получить все места, которые находятся в любой этих областей, в одной строке (разве Rails не хорош? ):
filtered_venues = Venue.all(:conditions => {:area_id => params[:areas]})
Просто убедитесь, что у вас есть действительный массив идентификаторов областей, прежде чем вызывать этот искатель - если вы этого не сделаете, ваш хэш условий оценивается как {: area_id => nil}, а Rails найдет вам все места, которые не У меня есть area_id - вероятно, нет, и определенно не то, что вы хотите.
Надеюсь, это поможет!