从URL获取父资源

时间:2010-10-30 19:37:31

标签: ruby-on-rails nested-resources

我有两个具有has_many关系的对象(@stacks和@stories)(通过@anthologies)。故事可以单独查看(/ stories / 1 /)或作为Stack中的集合(/ stacks / 1 / stories / 1 /)查看。

map.resources :stories
map.resources :anthologies
map.resources :stacks, :has_many => :stories do |stack|
  stack.resources :stories
end  

我已经有了这个基本框架工作我正在尝试识别故事作为堆栈的一部分呈现的时间,以便我可以在故事之间构建一些导航。我认为最简单的方法是检查主控制器的URL,但1)我不知道如何做到这一点,2)它似乎非常不Railsy,就像应该有一个更直接的方式。

仍然关注Rails的一些基础知识 - 有关如何实现所需功能的任何建议吗?

2 个答案:

答案 0 :(得分:3)

您已为:stories定义了嵌套和非嵌套路由。当您的StoriesController收到包含以下参数的请求时:

/stacks/1/stories # nested form

或与这些

/stories # non-nested form

路线将映射到{:controller => :stories, :action => :index }。在嵌套形式中,params哈希将包含:stack_id => 1。在非嵌套形式中,它不会。

答案 1 :(得分:1)

如果您正在访问子资源,则params默认包含父资源。

例如“/ stacks / 1 / stories / 2 /”将具有这样的参数结构:

{:action => 'show', :controller => 'stories', :stack_id => 1, :id => 2 }

如果你想在控制器中找到嵌套资源,只需在params散列中查找parent_id的存在,例如:

before_filter :find_stack

protected
def find_stack
  if params[:stack_id]
     Stack.find(params[:stack_id])
  end
end