ruby-on-rails - 使用辅助方法路由到不同的索引实例
问题描述
我有一个名为 BookingsController 的控制器,带有一个 bookings#index 操作。在 index 操作中,有 2 个实例变量@pending_bookings
和@approved_bookings
,它们通过 查询 Booking 对象status
。
def index
@pending_bookings = Booking.where(host_id:@user.id,
status:'pending')
@approved_bookings = Booking.where(host_id:@user.id,
status:'approved')
end
我想根据用户单击的链接将用户路由到不同的索引实例。基本上bookings_path(@pending_bookings)
应该将用户路由到显示所有的索引页面pending_bookings
,反之,bookings_path(@approved_bookings)
应该将用户路由到显示所有的索引页面approved_bookings
。
在我看来,我有 2 个链接应该分别将用户引导到每个路径。
<%= link_to 'Pending Reservations', bookings_path(@pending_bookings)%>
<%= link_to 'Approved Reservations', bookings_path(@approved_bookings)%> `
index.html.erb 文件:
<%= booking_index_helper_path %>
包含一个嵌入式帮助方法,该方法应识别用户单击的路径并呈现正确的 Booking 对象。
这是识别用户选择的路径并渲染必要对象的(有缺陷的)逻辑:
pages_helper.rb:
def booking_index_helper_path
if bookings_path(@pending_bookings)
render @pending_bookings
elsif bookings_path(@approved_bookings)
render @approved_bookings
else bookings_path(@total_bookings)
@total_bookings
end
end
我binding.pry
在辅助方法中放了一个来确认它被击中(它是)。但是,由于某种原因,当我单击链接以将我定向到正确的对象时,始终满足第一个条件。编写此条件以识别用户选择的路径的更好方法是什么?
解决方案
看起来你正在以一种比你需要的更复杂的方式来解决这个问题。为什么不只是有一个像这样的索引:
def index
#Rails autoescapes this string so no fear of sql injection using user supplied strings
@bookings = Booking.where(host_id:@user.id, status: "#{params[:status]}")
end
然后使用如下链接:
<%= link_to 'Pending Reservations', bookings_path(status: 'pending')%>
<%= link_to 'Approved Reservations', bookings_path(status: 'approved')%> `
现在您的视图可以处理@bookings
而不关心类型,@bookings
因为这是由控制器中的逻辑完成的。这是最低要求,但您应该养成向控制器添加错误消息等的习惯,因此请考虑这样做:
def index
if params[:status].present?
#Rails autoescapes this string so no fear of sql injection using user supplied strings
@bookings = Booking.where(host_id:@user.id, status: "#{params[:status]}")
flash[:success] = "#{params[:status].titleize} Bookings loaded."
redirect_to whatever_path
else
flash[:error] = "Something went wrong"
redirect_to some_path
end
end
推荐阅读
- javascript - 使用路由时将匹配参数和道具传递给反应组件
- php - Laravel Sqlite 数据库无法连接
- eclipse - 从以前工作的安装中突然从 eclipse egit 中获得“没有更多可用的身份验证方法”
- php - php preg_replace 正则表达式留下问号工件
- python - 如何以编程方式将在线网页目标元素打印成图像?
- android - 为什么我的 30-40% 的 Android 用户无法使用警报?
- c# - 这个委托在 main 方法中的目的是什么?
- java - 在 Android 中与 OpenCV 进行模板匹配时断言失败错误
- excel - VBA,当我向表中添加行,然后调整表大小时,不会在数据透视表中获取新值
- clang - 构建软件包时架构 x86_64 的未定义符号