4

如果您有一个既非嵌套又嵌套的模型,例如产品,您对问题的解决方案是什么:

一个“产品”可以属于_说一个“事件”,一个产品也可以是独立的。

这意味着我可以有这样的路线:

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

您如何正确处理您的观点?

注意:这是一个管理面板。我希望能够有一个“创建活动”页面,其中有一个用于创建票证(产品)、表格和检查谁被回复的侧面板。因此,您将单击“活动门票”侧面板按钮,然后您将转到/events/my-new-event/tickets. 但管理面板还有一个根“产品”选项卡,可以列出门票和其他随机产品。“门票”和“产品”视图看起来 90% 相同,但门票将包含有关其所属活动的一些信息。

看来我必须有这样的观点:

  • 产品/index.haml
  • 产品/show.haml
  • 事件/产品/index.haml
  • 事件/产品/show.haml

但这似乎并不干燥。或者我可以有条件检查产品是否有一个事件(@product.event.nil?),但是这样视图就很难理解了。

你如何处理这些情况?

非常感谢。

4

3 回答 3

2

我建议您使用自己的视图制作单独的管理控制器来管理您想要的一切。您的客户的逻辑留在产品控制器中。

于 2010-03-22T22:55:14.700 回答
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
于 2011-07-28T11:52:52.840 回答
0

对于这个问题,我没有好的和干净的解决方案。通常,如果视图差异不大,我会使用单个视图并添加一些代码,例如@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版本。

于 2010-03-24T09:43:03.647 回答