2010-03-22 29 views
4

什麼是你的問題的解決方案,如果您有兩個未嵌套和嵌套的模型,如產品:乾涸的Rails使用嵌套資源視圖

「產品」可以belong_to說的「事件「,而產品也可以是獨立的。

這意味着我能有這樣的路線:

map.resources :products # /products 
map.resources :events do |event| 
    event.resources :products # /events/1/products 
end 

你是如何處理,在你的觀點是否正確?

注意:這是一個管理面板。我希望能夠創建一個「創建事件」頁面,並帶有一個側面板,用於創建票證(產品),表單以及檢查誰是rsvp的。所以你點擊「活動門票」側面板按鈕,它會帶你到/events/my-new-event/tickets。但是管理面板上還有一個根「產品」選項卡,可以列出票據和其他隨機產品。 '門票'和'產品'的觀點看起來相同,但門票將有一些關於它屬於的事件的信息。

好像我得有看法是這樣的:

  • 產品/ index.haml
  • 產品/ show.haml
  • 事件/產品/ index.haml
  • events/products/show.haml

但這似乎不幹。或者我可以通過條件檢查來查看產品是否有事件(@product.event.nil?),但這些觀點很難理解。

你如何處理這些情況?

非常感謝。

回答

2

我建議你製作單獨的管理員控制器以及它自己的視圖來管理你想要的任何東西。而你的客戶的邏輯仍然停留在產品控制器上。

0

我對這個問題沒有很好的解決方案。 Usualy如果意見差別不大,我使用單一視圖並添加一些代碼,如@product.event.nil?。您可以隨時添加一些變量或幫助程序,以縮短此方法,例如has_event? - 那麼您的視圖看起來會更乾淨。並用它在像這樣的代碼:

<% if has_event? %> 
    some html 
<% end %> 

或單行:

<%= link_to 'Something special', foo_path if has_event? %> 

在另一邊,你可以創建兩個意見相同的幾個諧音,把它們放在某個文件夾上例/shared/products/...並從您的觀點是這樣使其:

<%= render :partial => '/shared/products/info' %> 

等。

但是,如果他們沒有太大的差異,我真的會使用if版本。

0

該意見將由ProductsController處理。您可以根據資源的嵌套更改控制器中的邏輯。

# app/controller/products_controller.rb 
# ...some code... 
def index 
    @event = Event.find_by_id(params[:event_id]) if params[:event_id] 
    @products = @event ? @event.products : Product.all 
end 

該視圖將通過通常的產品視圖中處理

# app/views/products/index.html.haml 
- unless @products.blank? 
    - @products.each do |product| 
     %p= product.some_attribute