在Rails中查看嵌套资源的最佳实践?

时间:2010-03-17 17:57:38

标签: ruby-on-rails views

我有一个相当简单的模型;用户拥有很多产品。我希望能够查看所有产品的列表以及与给定用户关联的产品列表。我的路线设置如下:

/products
/products/:id
/users
/users/:id
/users/:id/products

这里的问题是,我想在 product#index 视图和 user / products#index 视图中以不同方式显示产品列表。

有没有'正确'的方法呢?我目前的解决方案是将产品定义为用户内部的嵌套资源,然后检查params [:user_id] - 如果找到它我会渲染一个名为'index_from_user'的模板,否则我只渲染典型的'索引'模板。

这种情况我遇到了很多 - 如果有一种首选方式,我很想知道......

1 个答案:

答案 0 :(得分:2)

您可以声明两条“产品”路线 - 一条属于用户,一条独立于用户,例如:

map.resources:products    map.resources:users,:has_many => :制品

他们都会查找“ProductsController #index”,但第二个会从路径中预先填充“user_id”(注意:“user_id”不仅仅是“id”)

因此,您可以在索引方法中测试它,并根据它是否存在显示不同的项目。

您需要在ProductController中添加一个before_filter,以便在使用之前实际实例化用户模型,例如:

before_filter :get_user # put any exceptions here

def index
  @products = @user.present? ? @user.products : Product.all
end

# all the other actions here...


# somewhere near the bottom...
private

def get_user
  @user = User.find(params[:user_id])
end

如果您真的想要显示完全不同的视图,您可以在索引操作中明确地执行此操作,例如:

def index
  @products = @user.present? ? @user.products : Product.all
  if @user.present?
     return render(:action => :user_view) # or whatever...
  end
  # will render the default template...
end