如何在Rails中查看用户的所有订单?

时间:2018-11-17 01:07:38

标签: ruby-on-rails ruby

我制作了一个简单的Rails应用,用户可以在其中将自己制作的订单添加到Order模型中。我使用了Devise,并且已经能够弄清楚如何仅允许用户删除和编辑他们的订单。现在,我希望用户能够查看他们创建的所有订单。一个用户有很多订单,而订单属于该用户。

我希望能够去localhost:3000/users/1/orders并查看他们的所有订单。

这是我当前的订单控制者:

class OrdersController < ApplicationController
    before_action :find_order, only: [:edit, :destroy, :update, :show]

    def index
        @orders = Order.all.order("created_at DESC")
    end

    def new
        @order = current_user.orders.build
    end

    def update
        if @order.update(order_params)
            redirect_to root_path
        else
            render 'edit'
        end
    end

    def show
    end

    def create
        @order = current_user.orders.build(order_params)

        if @order.save
            redirect_to root_path
        else
            render 'new'
        end
    end

    def edit
    end

    def destroy
        @order.destroy
        redirect_to root_path
    end

    private

        def order_params
            params.require(:order).permit(:start_point, :restaurant_location, :customer_location, :fee)
        end

        def find_order
            @order = Order.find(params[:id])
        end

end

谢谢!

1 个答案:

答案 0 :(得分:2)

我会这样设置:

resources :users, only: [] do
  resources :orders, module: :users, only: :index
end

这会将/users/:user_id/orders路由到Users::OrdersController#index

使用module选项是一个不错的技巧,它使您可以区分嵌套资源和非嵌套资源。这意味着它不会影响您现有的订单索引。

创建控制器本身非常简单:

# app/controllers/users/orders_controller.rb
module Users
  class OrdersController
    # GET /users/:user_id/orders
    def index
      @user = User.includes(:orders).find(params[:user_id])
      @orders = @user.orders
    end
  end
end

然后创建一个视图:

# app/views/users/orders/index.html.erb
<table>
  <thead>
    <tr>
       <th>id</th>
       <th>created_at</th>
    </tr>
  </thead>
  <tbody>
    <% @orders.each do |order|%>
    <tr>
      <td><%= order.id %></td>
      <td><%= order.created_at %></td>
    </tr>
    <% end %>
  </tbody>
</table>

请记住,如果您想与“正常”索引共享视图代码,则偏偏对象是您的朋友。