根据范围显示不同的索引

时间:2017-08-06 11:13:59

标签: ruby-on-rails ruby

我有一个Orders索引页面,其中包含两个链接,其索引我想根据订单状态进行筛选:

<%= link_to "Current Orders", orders_path(:by_status => "processing") %>
...
<%= link_to "Past Orders", orders_path(:by_status => "completed") %>

我的控制器如下:

class OrdersController < ApplicationController
  has_scope :by_status

  def index
    case params[:status]
    when "completed"
      @past_orders = Order.where(status: "completed")
    when "processing"
      @current_orders = Order.where(status: "processing")
    end
  end
end

我确定def index是主要问题。但我也无法弄清楚如何在视图页面中显示它。我有:

<% @past_orders.each do |order| %>

我很感激帮助。

2 个答案:

答案 0 :(得分:0)

要解决您的问题,您可以根据条件从index.html.erb

拆分渲染

在index.html.erb创建条件,如果@post_orders有内容然后渲染past_orders,则渲染current_order

  <% if @post_orders %>
    <%= render 'past_order.html.erb' %>
  <% else %>
    <%= render 'current_order.html.erb' %>
  <% end %>

然后你创建两个名为_past_order.html.erb的部分文件,并将_current_order.html.erb放在与index.html.erb相同的文件夹中

答案 1 :(得分:0)

如果您希望两个范围的视图看起来相同,那么您应该在控制器上处理它。看起来你正在使用has_scope gem,所以这应该有效:

class OrdersController < ApplicationController
  has_scope :by_status, only: :index

  def index
    @orders = apply_scopes(Order)
  end
end

您需要在Order模型

上使用匹配的范围方法
class Order < ApplicationRecord
  scope :by_status, ->(status) { where status: status }
end

在您的视图 orders/index.html.erb 中,您将以完全相同的方式处理集合,对当前和过去的订单使用@orders

<% @orders.each do |order| %>

如果您需要根据订单状态以不同方式显示视图的组件,只需添加if语句

<% if order.status == "completed" >
  <p>Something<p>
<% else >
  <p>Something else<p>
<% end >