用于资源的不同视图的Rails方式

时间:2015-05-07 12:27:46

标签: ruby-on-rails

让我们假设我们有两个资源:拍卖和出价,并且拍卖有许多出价可能被建模为嵌套资源。有两种可能的出价集合:铁路应用程序中所有出价的收集以及与特定拍卖相关的出价集合。如果用户想要访问这两个集合,我们将如何在控制器中对其进行建模?

一种可能的解决方案是构建两条路线(auction /:auction_id / bid和bid /),指向BidsController #index动作并根据params [:auction_id]的存在进行分支。可以想象,如果出价也属于用户,则情况会恶化,从而在我们的BidsController检查params [:user_id]时创建另一个条件,以返回与给定用户相关联的出价集合。处理这个问题的轨道方式是什么?

2 个答案:

答案 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>

这只是处理这种情况的一种方法。您可以使用您的用户模型或应用程序中的任何其他模型执行相同的操作。重点是,每当您希望该模型出现在视图中时,您不必涉及模型的特定控制器。