rails 3 nested routing error - ruby-on-rails-3

my routes.rb
TerritoryManagement::Application.routes.draw do
resources :addresses
resources :territories, :shallow => true do
resources :addresses
end
end
rake routes says
$ rake routes
addresses GET /addresses(.:format)
{:action=>"index", :controller=>"addresses"}
POST /addresses(.:format)
{:action=>"create", :controller=>"addresses"}
new_address GET /addresses/new(.:format)
{:action=>"new", :controller=>"addresses"}
edit_address GET /addresses/:id/edit(.:format)
{:action=>"edit", :controller=>"addresses"}
address GET /addresses/:id(.:format)
{:action=>"show", :controller=>"addresses"}
PUT /addresses/:id(.:format)
{:action=>"update", :controller=>"addresses"}
DELETE /addresses/:id(.:format)
{:action=>"destroy", :controller=>"addresses"}
territory_addresses GET /territories/:territory_id/addresses(.:format)
{:action=>"index", :controller=>"addresses"}
POST /territories/:territory_id/addresses(.:format)
{:action=>"create", :controller=>"addresses"}
new_territory_address GET /territories/:territory_id/addresses/new(.:format)
{:action=>"new", :controller=>"addresses"}
GET /addresses/:id/edit(.:format)
{:action=>"edit", :controller=>"addresses"}
GET /addresses/:id(.:format)
{:action=>"show", :controller=>"addresses"}
PUT /addresses/:id(.:format)
{:action=>"update", :controller=>"addresses"}
DELETE /addresses/:id(.:format)
{:action=>"destroy", :controller=>"addresses"}
territories GET /territories(.:format)
{:action=>"index", :controller=>"territories"}
POST /territories(.:format)
{:action=>"create", :controller=>"territories"}
new_territory GET /territories/new(.:format)
{:action=>"new", :controller=>"territories"}
edit_territory GET /territories/:id/edit(.:format)
{:action=>"edit", :controller=>"territories"}
territory GET /territories/:id(.:format)
{:action=>"show", :controller=>"territories"}
PUT /territories/:id(.:format)
{:action=>"update", :controller=>"territories"}
DELETE /territories/:id(.:format)
{:action=>"destroy", :controller=>"territories"}
in my list of territories I have the link
<td><%= link_to 'Show', new_territory_address_path %></td>
I get the error
No route matches {:controller=>"addresses", :action=>"new"}
Extracted source (around line #14):
11: <% #territories.each do |territory| %>
12: <tr>
13: <td><%= territory.name %></td>
14: <td><%= link_to 'Show', new_territory_address_path %></td>
15: <td><%= link_to 'Delete', territory, :confirm => 'Are you sure?', :method => :delete %>
16: </tr>
17: <% end %>
What am I missing?
Thomas

Have you tried passing it a territory_id? Notice how it's included in the full route.
new_territory_address_path(:territory_id => territory.id)

Related

link_to update a Devise user, method => put

I'm trying to update a single databasefield of my current_user (devise).
I want to do this just with the link_to helper:
<%= link_to "Grid", edit_user_registration_path(current_user, :project_view => "grid"), :method => :put %>
But I can't get it to work since the result it allways an error:
Routing Error
No route matches [PUT] "/users/edit.1"
My Routes for Devise:
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_password POST /users/password(.:format) devise/passwords#create
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
PUT /users/password(.:format) devise/passwords#update
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel
user_registration POST /users(.:format) devise/registrations#create
new_user_registration GET /users/sign_up(.:format) devise/registrations#new
edit_user_registration GET /users/edit(.:format) devise/registrations#edit
PUT /users(.:format) devise/registrations#update
DELETE /users(.:format) devise/registrations#destroy
What's wrong with the routing? I'm using devise without any custom modifications.
Thanks!
Wrong path helper:
$ rake routes
new_user_registration GET ... registrations#new
cancel_user_registration GET ... registrations#cancel
user_registration POST ... registrations#create
edit_user_registration GET ... registrations#edit
users PUT ... registrations#update # You want this one
DELETE ... registrations#destroy
Result:
<%= link_to "Grid", users_path(:user => {:project_view => 'grid'}), :method => :put, :confirm => "Are you sure?" %>
Update for your specific routes:
<%= link_to "Grid", registration_path(resource_name, :user => {:project_view => 'grid'}), :method => :put, :confirm => "Are you sure?" %>

View's testing indicates 'No route matches' for nested resource

I have a Training model that's nested under a devise User model.
/config/routes.rb
devise_for :users, path: 'u'
resources :users, only: ['index','show'], shallow: true do
resources :trainings
end
> rake routes
new_user_session GET /u/sign_in(.:format) {:action=>"new", :controller=>"devise/sessions"}
user_session POST /u/sign_in(.:format) {:action=>"create", :controller=>"devise/sessions"}
destroy_user_session DELETE /u/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
user_password POST /u/password(.:format) {:action=>"create", :controller=>"devise/passwords"}
new_user_password GET /u/password/new(.:format) {:action=>"new", :controller=>"devise/passwords"}
edit_user_password GET /u/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
PUT /u/password(.:format) {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET /u/cancel(.:format) {:action=>"cancel", :controller=>"devise/registrations"}
user_registration POST /u(.:format) {:action=>"create", :controller=>"devise/registrations"}
new_user_registration GET /u/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"}
edit_user_registration GET /u/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"}
PUT /u(.:format) {:action=>"update", :controller=>"devise/registrations"}
DELETE /u(.:format) {:action=>"destroy", :controller=>"devise/registrations"}
user_trainings GET /users/:user_id/trainings(.:format) {:action=>"index", :controller=>"trainings"}
POST /users/:user_id/trainings(.:format) {:action=>"create", :controller=>"trainings"}
new_user_training GET /users/:user_id/trainings/new(.:format) {:action=>"new", :controller=>"trainings"}
edit_training GET /trainings/:id/edit(.:format) {:action=>"edit", :controller=>"trainings"}
training GET /trainings/:id(.:format) {:action=>"show", :controller=>"trainings"}
PUT /trainings/:id(.:format) {:action=>"update", :controller=>"trainings"}
DELETE /trainings/:id(.:format) {:action=>"destroy", :controller=>"trainings"}
users GET /users(.:format) {:action=>"index", :controller=>"users"}
user GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
root / {:controller=>"team", :action=>"index"}
teams GET /teams(.:format) {:action=>"index", :controller=>"teams"}
POST /teams(.:format) {:action=>"create", :controller=>"teams"}
new_team GET /teams/new(.:format) {:action=>"new", :controller=>"teams"}
edit_team GET /teams/:id/edit(.:format) {:action=>"edit", :controller=>"teams"}
team GET /teams/:id(.:format) {:action=>"show", :controller=>"teams"}
PUT /teams/:id(.:format) {:action=>"update", :controller=>"teams"}
DELETE /teams/:id(.:format) {:action=>"destroy", :controller=>"teams"}
I'm having the following outputs when testing views:
Failures:
1) trainings/edit renders the edit training form
Failure/Error: render
ActionView::Template::Error:
No route matches {:controller=>"trainings"}
# ./app/views/trainings/edit.html.erb:6:in `_app_views_trainings_edit_html_erb___268980906337666865_45435220'
# ./spec/views/trainings/edit.html.erb_spec.rb:12:in `block (2 levels) in <top (required)>'
2) trainings/index renders a list of trainings
Failure/Error: render
ActionView::Template::Error:
No route matches {:action=>"new", :controller=>"trainings"}
# ./app/views/trainings/index.html.erb:25:in `_app_views_trainings_index_html_erb___2979006340799666900_47907140'
# ./spec/views/trainings/index.html.erb_spec.rb:18:in `block (2 levels) in <top (required)>'
3) trainings/show renders attributes in <p>
Failure/Error: render
ActionView::Template::Error:
No route matches {:controller=>"trainings"}
# ./app/views/trainings/show.html.erb:10:in `_app_views_trainings_show_html_erb__2049701071134787176_46584480'
# ./spec/views/trainings/show.html.erb_spec.rb:12:in `block (2 levels) in <top (required)>'
4) trainings/new renders new training form
Failure/Error: render
ActionView::Template::Error:
undefined method `trainings_path' for #<#<Class:0x00000004a54688>:0x0000000686bec8>
# ./app/views/trainings/_form.html.erb:1:in `_app_views_trainings__form_html_erb__4221989810981841567_45123700'
# ./app/views/trainings/new.html.erb:3:in `_app_views_trainings_new_html_erb__472203814357098165_54200400'
# ./spec/views/trainings/new.html.erb_spec.rb:12:in `block (2 levels) in <top (required)>'
I won't post all tests and all layout files because it would get too big. Instead I'll post test and layout file for one view, and try to extend the correction to the others.
The test for training#index is
/spec/views/trainings/index.html.erb_spec.rb
require 'spec_helper'
describe "trainings/index" do
before(:each) do
assign(:trainings, [
stub_model(Training,
:user_id => 1,
:training => "MyText"
),
stub_model(Training,
:user_id => 1,
:training => "MyText"
)
])
end
it "renders a list of trainings" do
render
# Run the generator again with the --webrat flag if you want to use webrat matchers
assert_select "tr>td", :text => 1.to_s, :count => 2
assert_select "tr>td", :text => "MyText".to_s, :count => 2
end
end
/app/views/index.html.rb
<h1>Listing trainings</h1>
<table>
<tr>
<th>User</th>
<th>Training</th>
<th></th>
<th></th>
<th></th>
</tr>
<% #trainings.each do |training| %>
<tr>
<td><%= training.user_id %></td>
<td><%= training.training %></td>
<td><%= link_to 'Show', training %></td>
<td><%= link_to 'Edit', edit_training_path(training) %></td>
<td><%= link_to 'Destroy', training, confirm: 'Are you sure?', method: :delete %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'New Training', new_user_training_path(#user) %>
It indicates that routes doens't match, but they are there. Why is it happening?!
Your index view has new_user_training_path(#user), but your index spec is not creating #user. Just like you created #trainings you also need to create #user in your view spec, something like:
before(:each) do
assign(:user,
stub_model(User,
:id => 1
)
)
# ...
end
Also, the ActionView::Template::Error: undefined method 'trainings_path' for #<#<Class:...>> error is fixed by changing your new view from form_for #training to form_for [#user, #training] (nested).

BEGINNER: simple link_to / routing

I'm really starting to cry here ;) Trying to make a link in a Models index view.
I have 2 simple Models: Users and Posts. There both generated with scaffolding and have working joins. A user has_many :posts and a post belongs_to :user.
What I'm trying to do in the views/post/index.html.er file is a list of the Post title and the user who it belongs to. It works well (also learning html5):
<% #posts.each do |post| %>
<p><%= link_to post.user.name, users_path %>: <b><%= post.title %></b></p>
<% end %>
Well, it works but the "users_path" is not what I want. I want to link to the specific User which the post belongs_to. I'm sorry to say that I don't get much help from http://guides.rubyonrails.org/routing.html.
How should I do this? Do I have to specify a #user in the posts_controller index-action? I reallt appreciate long and detaild answears here.
Tnk soooo much for patience with a beginner ;)
you probably have this in your routes -
resources :posts do
resources :users
end
rake routes would generate the following mapping -
post_users GET /posts/:post_id/users(.:format) {:action=>"index", :controller=>"users"}
POST /posts/:post_id/users(.:format) {:action=>"create", :controller=>"users"}
new_post_user GET /posts/:post_id/users/new(.:format) {:action=>"new", :controller=>"users"}
edit_post_user GET /posts/:post_id/users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
post_user GET /posts/:post_id/users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /posts/:post_id/users/:id(.:format) {:action=>"update", :controller=>"users"}
DELETE /posts/:post_id/users/:id(.:format) {:action=>"destroy", :controller=>"users"}
posts GET /posts(.:format) {:action=>"index", :controller=>"posts"}
POST /posts(.:format) {:action=>"create", :controller=>"posts"}
new_post GET /posts/new(.:format) {:action=>"new", :controller=>"posts"}
edit_post GET /posts/:id/edit(.:format) {:action=>"edit", :controller=>"posts"}
post GET /posts/:id(.:format) {:action=>"show", :controller=>"posts"}
PUT /posts/:id(.:format) {:action=>"update", :controller=>"posts"}
DELETE /posts/:id(.:format) {:action=>"destroy", :controller=>"posts"}
The above explains the url you can use and what objects need to be passed.
For linking the user of the post -
<%= link_to "Post User details", post_user_path(post, post.user) %>
OR
<%= link_to "Post User details", url_for([post, post.user]) %>

Named route from resources takes me to show page instead of delete page

I am using resources :users in routes.rb. This provides the following paths as rake routes unveils.
users GET /users(.:format) {:action=>"index", :controller=>"users"}
POST /users(.:format) {:action=>"create", :controller=>"users"}
new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"}
edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
user GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"}
Further, I comment out the legacy wild controller route.
#match ':controller(/:action(/:id(.:format)))'
To add a delete link on my users page I add the following.
<%= link_to "Delete user", user, :method => :delete, :confirm => "Are you sure?" %>
This generated the following html code.
Delete user
I click the link and it takes me to the show page?! What's wrong?
You need to include the default Javascript files for that to work properly:
<%= javascript_include_tag :defaults %>

what's the path to destroy registration with devise

I'm trying to add a link so the user can destroy his/her own account. I'm using the built-in registration class.
In my view I have <%= link_to 'Destroy', current_user, :confirm => 'Are you sure you want to destroy your account?', :method => :delete %> pointing to localhost:3000/users/4 by example
First of all, is that the correct link to use?
Secondly, how to redirect to root path because presently it looks like it tries to redirect to user with id 4 (and it fails because it is protected).
Rake routes gives DELETE /users(.:format) {:action=>"destroy", :controller=>"devise/registrations"}
Thanks in advance.
Try
<%= link_to 'Destroy', user_registration_path, :confirm => 'Are you sure you want to destroy your account?', :method => :delete %>
It's because of devise treat registration as Singular Resource.
Besides, run rake routes and you can see details about registration routing:
user_registration POST /users(.:format) {:action=>"create", :controller=>"devise/registrations"}
new_user_registration GET /users/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"}
edit_user_registration GET /users/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"}
user_registration PUT /users(.:format) {:action=>"update", :controller=>"devise/registrations"}
user_registration DELETE /users(.:format) {:action=>"destroy", :controller=>"devise/registrations"}
It means:
user_registration_path is a helper method that returns /users(.format)
Perform DELETE request on /users(.format) will delete the registration