Rails 4 использует немодельные атрибуты в параметрах, что приводит к неопределенному методу `merge' для nil:NilClass

У меня есть форма поиска на индексной странице для моей модели свойств, которая использует как Ransack, так и Geocoder для поиска полей модели свойств, а также для сужения результатов в зависимости от расстояния от адреса, введенного пользователем в форме поиска.

Адрес и расстояние фиксируются в форме с :nearaddress и :distance соответственно, которые я отправляю в params[:near]. Я проверяю их наличие в действии индекса контроллера после этот ответ. Результатом является «неопределенный метод `merge' для nil:NilClass» при переходе к /properties, поэтому представление не будет отображаться. Как правильно передать контроллеру эти немодельные параметры формы? Я думаю, что это может быть серьезной проблемой параметров, но я застрял в том, как разрешить эти атрибуты, которых нет в модели свойств. Ошибка выделяет строку «f.text_field:nearaddress».

index.html.erb:
...form fields that work when excluding the two that follow...
<div class ="field">
  <%= f.label :nearaddress, "Address" %>
  <%= f.text_field :nearaddress, params[:near] %>
</div>
<div class ="field">
  <%= label_tag :distance %>
  <%= text_field_tag :distance, params[:near] %> miles
</div>
<div class="actions"><%= f.submit "Search" %></div>
<% end %>

properties_controller.rb:
def index
if params[:near].present? && (params[:near].to_i >0)
  @search = Property.near(params[:near]).search(params[:q])
else  
  @search = Property.search(params[:q])
end
  @properties = @search.result(:distinct => true).paginate(:page => params[:page])
  ...
end

person UserDuser    schedule 03.12.2013    source источник


Ответы (1)


Я смог решить эту проблему, удалив букву «f». и добавление «_tag» в поле :nearaddress, а также указание параметров в индексе контроллера:

<%= label_tag :nearaddress, "Near Address" %>
<%= text_field_tag :nearaddress, params[:near] %>
<%= label_tag :distance, "Distance From Address (mi)" %>
<%= text_field_tag :distance, params[:near] %>
<div class="actions"><%= f.submit "Search" %>
<% end %>

if params[:distance].present? && (params[:distance].to_i >0) && params[:nearaddress].present?
  @search = Property.near(params[:nearaddress],params[:distance]).search(params[:q])
else  
  @search = Property.search(params[:q])
end
person UserDuser    schedule 12.12.2013