Rails 中嵌套资源视图的最佳实践?

Posted

技术标签:

【中文标题】Rails 中嵌套资源视图的最佳实践?【英文标题】:Best Practice for views to nested resources in Rails? 【发布时间】:2010-03-17 17:57:38 【问题描述】:

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

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

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

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

这是我经常遇到的情况 - 如果有更好的方法,我很想知道...

【问题讨论】:

通常认为“接受”可以解决您的问题的答案是一种很好的形式。您可以通过单击答案旁边的“打勾”来做到这一点:) 【参考方案1】:

您可以声明两条“产品”路线——一条在用户之下,一条独立于用户,例如:

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

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

因此您可以在 index 方法中对其进行测试,并根据是否存在显示不同的项目。

您需要在 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

【讨论】:

以上是关于Rails 中嵌套资源视图的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

Rails URL 的嵌套路由和参数(最佳实践)

处理 Rails 中 STI 子类的路由的最佳实践

Ember 身份验证最佳实践?

在 Rails 中测试模型的最佳实践是啥?

如何重用 Rails 中嵌套控制器的渲染动作?

Rails 3.1 - 嵌入 flash.swf 文件 - 最佳实践?