I have a simple User model with a singular nested Profile resource so in my routes.rb I have:
resources :users do
resource :profile, :only => [:edit, :update, :show]
end
This generates the expected routes:
edit_user_profile GET /users/:user_id/profile/edit(.:format) {:action=>"edit", :controller=>"profiles"}
user_profile GET /users/:user_id/profile(.:format) {:action=>"show", :controller=>"profiles"}
user_profile PUT /users/:user_id/profile(.:format) {:action=>"update", :controller=>"profiles"}
I've created a simple controller update method that updates the model and then redirects upon successful update:
def update
@profile = Profile.find_by_user_id(params[:user_id])
@user = User.find_by_id(params[:user_id])
respond_to do |format|
if @profile.update_attributes(params[:profile])
format.html { redirect_to( user_profile_path(@user, @profile), :notice => 'Profile was successfully updated.') }
else
# ...
end
end
end
The problem is that once the form is submitted, the form redirects to mydomain.com/users/4/profile.22 where 22 happens to be the id of the profile. Clearly this confuses the controllers since the routing interprets the '22' as the format.
My question is, how do I get this to redirect to mydomain.com/users/4/profile instead? I've tried the following variations on the redirect_to statement to no effect, they all result in the same incorrect url:
redirect_to( user_profile_path(@user), ... )
redirect_to( user_profile_path(@user, @profile), ... )
redirect_to([@user, @profile], ... )
redirect_to( @profile, ... )
What's more, using 'user_profile_path(@user)' elsewhere produces the correct url.
Any ideas? Oh, and I'm using Rails 3.0.0 and Ruby 1.9.2 if that helps.
In a nested route, the belongs_to (child) association is always nested under the has_many (parent) association. The first step is to add the nested routes like so: In the above Rails router example, the 'index' and 'show' routes are the only nested routes listed (additional or other resources can be added).
Difference between singular resource and resources in Rails routes. So far, we have been using resources to declare a resource. Rails also lets us declare a singular version of it using resource. Rails recommends us to use singular resource when we do not have an identifier.
Shallow nesting Adding the 'shallow: true' parameter to your nested resource will define routes at the base level, '/songs/', for four of our RESTful routes — show, edit, update and destroy, while leaving the remaining routes — index, new, create— at the nested level.
After looking around, it appears that the form generating the update had an incorrect url. If anyone is seeing this issue, it's because I had my form set up as:
form_for [@user, @profile] do |f| ...
This caused the form action to have the incorrect url (of the offending form above). Instead, I used
form_for @profile, :url => user_profile_path(@user) do |f| ...
and everything seemed to work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With