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?
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.
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