Как отфильтровать enum с помощью Ransak - PullRequest
0 голосов
/ 02 января 2019

Я использую Ransack Gem

У меня есть таблица заказов, которая имеет атрибут :status.

:status установлен как enum в order.rb

class Order < ApplicationRecord
  enum status: [:pending, :paid, :sent, :cancelled, :refunded]

  scope :pending,   -> { where(status: :pending) }
  scope :paid,      -> { where(status: :paid) }
  scope :sent,      -> { where(status: :sent) }
  scope :cancelled, -> { where(status: :cancelled) }
  scope :refunded,  -> { where(status: :refunded) }

  def self.ransackable_scopes(auth_object = nil)
    [:pending, :paid, :sent, :cancelled, :refunded]
  end
end

order_controller.rb

def index
    @q = Order.ransack(params[:q])
    @orders = @q.result(distinct: true)
end

def search
  index
  render :index
end

rout.rb

    resources :orders, only: [:index, :show] do 
        collection do
            match 'search' => 'orders#search', via: [:get, :post], as: :search
          end
    end

В моем index.html.erb У меня есть сводная таблица моих заказов

Мне нужны кнопки В ожидании - Платные - Отправленные , что, когда я нажимаю, он отображает заказы по статусу ...

Я пробовал это, и он не фильтруется ...

        <%= search_form_for @q, url: search_orders_path, html: {method: :post} do |f| %>
            <%= f.hidden_field :pending %>
            <%= f.submit "Pending", class: "btn btn-success" %>
        <% end %>

        <%= search_form_for @q, url: search_orders_path, html: {method: :post} do |f| %>
            <%= f.hidden_field :paid %>
            <%= f.submit "Paid", class: "btn btn-success" %>
        <% end %>


<% @orders.each do |order| %>
    <tbody>
      <tr>
        <td>FR-000<%= order.user.id %></td>
        <td><%= order.user.last_name %> </td>
        <td><%= order.user.first_name %></td>
        <td>#00<%= order.id %></td>
        <td><%= order.status %></td>
    </tr>
  </tbody>
<% end %>

1 Ответ

0 голосов
/ 02 января 2019

Я обошелся без ransank ...

order.rb

class Order < ApplicationRecord
  belongs_to :user
  has_many :items, class_name: "OrderItem", dependent: :destroy

  enum status: [:pending, :paid, :sent, :cancelled, :refunded]

  scope :pending,       -> { where(status: :pending) }
  scope :paid,          -> { where(status: :paid) }
  scope :sent,          -> { where(status: :sent) }
  scope :cancelled, -> { where(status: :cancelled) }
  scope :refunded,  -> { where(status: :refunded) }


  scope :filter_by_status, -> (status) do
    send(status)
  end
end

Я создал orders_helper.rb

module OrdersHelper
    def orders_filtered_by_status
        [:pending, :paid, :sent, :cancelled, :refunded]
    end
end

в моем orders_controller.rb

def index
        @orders = Order.all
        @orders = @orders.filter_by_status(params[:status])if params[:status]
    end

и, наконец, на мой взгляд orders / index.html.erb

<% orders_filtered_by_status.each do |status| %>
  <li class="tabs-bar__item">
    <%= link_to "#{status}", status: status %>
  </li>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...