首页 > 解决方案 > 使用辅助方法路由到不同的索引实例

问题描述

我有一个名为 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在辅助方法中放了一个来确认它被击中(它是)。但是,由于某种原因,当我单击链接以将我定向到正确的对象时,始终满足第一个条件。编写此条件以识别用户选择的路径的更好方法是什么?

标签: ruby-on-railsrubycontrollerhelperlink-to

解决方案


看起来你正在以一种比你需要的更复杂的方式来解决这个问题。为什么不只是有一个像这样的索引:

 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

推荐阅读