Ransack не работает (нет ошибки, просто не работает)

Было бы здорово, если бы кто-нибудь увидел, что я делаю неправильно. Следил за документами: https://github.com/activerecord-hackery/ransack

Моя модель определяет, что Signup has_many Inventories

Код контроллера:

def index
  @q = Inventory.search(params[:q])
  @inventories = @q.result.includes(:signup)
end

Посмотреть код:

<%= search_form_for @q, url: url_for(controller: 'inventories', action: 'index') do |f| %>
  <%= f.label :item_name_cont %>
  <%= f.search_field :item_name_cont %>
  <%= f.label :signup_email_cont %>
  <%= f.search_field :signup_email_cont %>
  <%= f.submit %>
<% end %>

<table>
  <thead>
    <tr>
      <th><%= sort_link(@q, :item_name, "Item", default_order: :desc) %></th>
      <th><%= sort_link(@q, 'signups.email', "Email") %></th>
      <th>Action</th>
      <th colspan="5"></th>
    </tr>
  </thead>
  <tbody>
    <% Inventory.all.each do |inventory| %>
      <tr>
        <td><%= inventory.item_name %></td>
        <td><%= inventory.signup.email %> %></td>
      </tr>
  </tbody>
</table>

Так же, если поможет, если убрать в форме поиска спецификацию url:, то получаю ошибку: No route matches [GET] "/inventories/search"


person james    schedule 26.06.2014    source источник


Ответы (3)


Лучший вариант

Убедитесь, что опубликованный вами код просмотра находится в файле views/inventories/index.html.erb, и измените Inventory.all.each на @inventories.each. Тогда вы сможете получить доступ к форме поиска по адресу http://localhost:3000/inventories.

Или

Судя по упомянутой вами ошибке, вы делаете это на странице /inventories/search. Если вы хотите придерживаться этого URL-адреса, переместите код метода index в метод search в вашем контроллере (как показано ниже) и добавьте маршрут для search с помощью GET в файле маршрутов.

def search
  @q = Inventory.search(params[:q])
  @inventories = @q.result.includes(:signup)
end
person San    schedule 27.06.2014
comment
ОООООО, да @inventories.each — это то, что заставило его работать (это было в правильном представлении). - person james; 27.06.2014
comment
Если вы были в правильном представлении, то я не понимаю, почему это не работает без указания url в search_form_for. Должно. - person San; 27.06.2014
comment
пожимаю плечами не знаю.. я тоже был в замешательстве, но я собираюсь смириться с этим - person james; 27.06.2014

Измените это;

def index
  @q = Inventory.search(params[:q])
  @inventories = @q.result.includes(:signup)
end

to

def index
  @q = Inventory.ransack(params[:q])
  @inventories = @q.result.includes(:signup)
end
person Acacia    schedule 26.06.2014
comment
Не работает. Также, согласно их документам, search == ransack пока поиск не предопределен, чего нет в моем приложении. - person james; 27.06.2014

Думаю, я попал в такую ​​же ситуацию. Возможно, он работает, просто его сложно определить. Вы получаете возврат? Возможны все возвраты? Если это так, это может быть связано с поиском по умолчанию. Поиск по умолчанию возвращает все, как и следовало ожидать, если бы вы только что поставили Inventory.all Try .

Inventory.ransack(name_eq: 'potatos').result

это также сработает

Inventory.ransack(special_potato_eq: 'potatoes').result

Это ограничит возврат точными совпадениями Inventory.potato или Inventory.special_potato.

Это точный бит кода, который работал для меня

@q = User.ransack(email_eq: params[:q][:email])

Проверьте ссылку ссылки для других вариантов поиска.

Ссылка: https://github.com/activerecord-hackery/ransack/wiki/basic-searching

person Harry Fairbanks    schedule 05.08.2016