2012-06-20 58 views
2

我有一個應用程序,我有一個Shipment模型。我創建了一個視圖,允許我在基於表格的佈局中創建貨件並查看貨件。一切都位於index.html.erb中,因爲所有操作都是通過ajax完成的。Rails 3.1一個模型的不同視圖

當貨件被創建時,默認狀態是「OPEN」。稍後當打印提單時,狀態將變爲「打印」。

我的目標是創建另一個視圖,僅列出允許操作員使用單獨表格打印提貨單的開放貨件。我的問題是軌道如何處理一個模型的多種形式和視圖的渲染?我是否應該使用單獨的控制器/視圖來處理與打印相關的動作/視圖,或者我應該使用兩個模型用於ex。裝運和OpenShipment?我很難找到解釋這個問題的文檔。

下面列出的是這個模型的模式以及當前視圖的目錄結構。希望這有助於解釋這個問題。查看目錄結構

views 
    shipments 
     index.html.erb 
     _shipment.html.erb 
     _shipment_table.html.erb 
     _form.html.erb 
     _edit_form.html.erb 
     create.js.coffee 
     edit.js.coffee 
     update.js.coffee 
     destroy.js.coffee  

回答

1

正如我所看到的,您將兩次顯示相同的東西。你可以通過兩種方式解決這個問題:要麼添加一個參數,並保持相同的控制器動作,要麼添加一個新的控制器動作(這可能會使一個更乾淨的URL - 取決於你的偏好)。

首先,定義一個scopeShipment

class Shipment 

    scope :open, lambda { where(:status => 'open') 

end 

這將使寫類似:

Shipment.open 

,這會給你所有開放的出貨量。

所以,你可以如下

def open_shipments 
    @shipments = Shipment.open 
    render :index 
end 

這將檢索開出貨量定義新的控制器動作,然後呈現相同的視圖索引。

爲了使它更乾淨,您可以將狀態設爲您網址中的參數。 在你config/routes.rb

get 'shipments/status/:status', :as => 'shipments#index' 

,然後你將有如下編輯您的index行動:

def index 
    if params[:status] 
    @shipments = Shipment.where(:status => params[:status]) 
    else 
    @shipments = Shipment.all 
    end 
end 

然後你可以訪問網址shipments/status/open這將給開出貨量,同樣shipments/status/printed將提供所有打印的貨件。

但url shipments?status=open會給你相同的結果(沒有任何必要的路線變​​化)。取決於你的味道。

希望這會有所幫助。

+0

優秀的解釋。正是我在找什麼。 – ctilley79

1

Shipment Model 
    t.string :item_code 
    t.string :status 
    t.string :bill_of_lading 
    t.integer :qty_shipped 
    t.datetime :ship_date 
    t.datetime :delivery_date 

創建控制器稱爲open_shipments一個新的行動,並呼籲open_shipments.html.erb一個新的視圖文件。向路由表添加新路由,並在某個視圖中創建鏈接以鏈接新路由。

在控制器操作中,將模型對象存取到實例變量中並在視圖中顯示這些實例變量。

祝你好運!

相關問題