我制作了一个简单的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
谢谢!
答案 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>
请记住,如果您想与“正常”索引共享视图代码,则偏偏对象是您的朋友。