让我们假设我们有两个资源:拍卖和出价,并且拍卖有许多出价可能被建模为嵌套资源。有两种可能的出价集合:铁路应用程序中所有出价的收集以及与特定拍卖相关的出价集合。如果用户想要访问这两个集合,我们将如何在控制器中对其进行建模?
一种可能的解决方案是构建两条路线(auction /:auction_id / bid和bid /),指向BidsController #index动作并根据params [:auction_id]的存在进行分支。可以想象,如果出价也属于用户,则情况会恶化,从而在我们的BidsController检查params [:user_id]时创建另一个条件,以返回与给定用户相关联的出价集合。处理这个问题的轨道方式是什么?
答案 0 :(得分:0)
处理嵌套资源的开箱即用解决方案是在子资源控制器中处理它:
Sampleapp::Application.routes.draw do
resources :bids
resources :users do
resources :bids # creates routes to BidsController
end
resources :auctions do
resources :bids # creates routes to BidsController
end
end
class BidsController < ApplicationController
before_action :set_bids, only: [:index]
before_action :set_bid, only: [:show, :update, :destroy]
def index
end
# ... new, create, edit, update, destroy
def set_bid
# when finding a singular resources we don't have to give a damn if it is nested
@bid = Bids.find(params[:id])
end
def set_bids
@bids = Bids.includes(:user, :auction)
if params.has_key?(:user_id)
@bids.where(user_id: params[:user_id])
elsif params.has_key?(:auction_id)
@bids.where(auction_id: params[:auction_id])
end
@bids.all
end
end
这里的优点是您可以通过非常少的代码重复获得完整的CRUD功能。
如果你想拥有不同的视图模板,或者做不同的排序等,你可以简单地覆盖索引路径。
Sampleapp::Application.routes.draw do
resources :bids
resources :users do
member do
get :bids, to: 'users#bids', :bids_per
end
resources :bids, except: [:index]
end
resources :auctions do
member do
get :bids, to: 'auction#bids', as: :bids_per
end
resources :bids, except: [:index]
end
end
另一种解决方案是创建AuctionsBidsController
并定义路线:
resources :auctions do
resources :bids, only: [:index], controller: 'AuctionsBids'
resources :bids, except: [:index]
end
答案 1 :(得分:0)
每次要显示出价列表时,您都不必参与出价控制器。例如,如果我正在设置此方案并希望显示与特定拍卖相关的出价列表,我会在拍卖控制器中处理,而不是出价控制器,如下所示:
class AuctionsController < ApplicationController
...
def show
@auction = Auction.find(params[:id])
@bids = @auction.bids #assuming the bids belong_to your Auction model
end
然后,在视图app / views / auctions / show.html.erb中的某个位置,您可以使用您在出价索引中使用的相同部分来列出出价:
<ul>
<%= render partial: 'bids/bid', collection: @bids %>
</ul>
这只是处理这种情况的一种方法。您可以使用您的用户模型或应用程序中的任何其他模型执行相同的操作。重点是,每当您希望该模型出现在视图中时,您不必涉及模型的特定控制器。