Getting the parent resource from the URL

2019-08-07 15:04发布

问题:

I've got two objects (@stacks and @stories) with has_many relationships (through @anthologies). Stories can be viewed individually (/stories/1/) or as a collection in a Stack (/stacks/1/stories/1/).

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

I've got this basic frame working I'm trying to identify the when a story is being rendered as part of a stack so that I can build some navigation between stories. I figure the easiest way to do this is to check the URL for the primary controller, but 1) I don't know how to do this, and 2) it seems very un-Railsy, like there should be a more direct way.

Still getting my head around some of the basics of Rails here -- any recommendations on how to achieve the desired functionality?

回答1:

You've defined both nested and non-nested routes for :stories. When your StoriesController receives a request with these parameters:

/stacks/1/stories # nested form

or with these

/stories # non-nested form

The route will map to {:controller => :stories, :action => :index }. In the nested form, the params hash will include :stack_id => 1. In the non-nested form, it won't.



回答2:

if you are accessing the child resource then the params will include the parent resource by default.

For example "/stacks/1/stories/2/" will have a params structure like this:

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

If you want to find the nested resource in the controller just look for the presence of the parent_id in the params hash e.g.:

before_filter :find_stack

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