开发者

Ruby on Rails nested resource routing error

I have a user, comment, and route model as shown:

class User < ActiveRecord::Base
 has_many :routes, :dependent => :destroy
 has_many :comments, :dependent => :destroy
end

class Route < ActiveRecord::Base
 belongs_to :user
end

class Comment < ActiveRecord::Base
 belongs_to :user
end

I have the routes.rb file nesting comments and routes within user as shown:

MyApp::Application.routes.draw do
resources :users do
 resources :comments
 resources :routes
end

When I run 'rake routes', the rou开发者_如何学Pythonte to the Routes_controller index appears as so:

user_routes GET /users/:user_id/routes(.:format) {:action =>"index", :controller=>"routes"}

Yet for some reason when a user is signing in, I get a routing error saying that the routes controller cannot be found. This happens when the system is posting a new session in the session controller. I know that it attempts to sign in the user, but fails on the redirect. Any suggestions?

class SessionsController < ApplicationController
...
def create
 user = User.authenticate(params[:session][:email],
                         params[:session][:password])
 if user.nil?
  flash.now[:error] = "Invalid email/password combination."
  @title = "Sign in"
  render 'new'
 else
  sign_in user
  redirect_to user_routes_path
 end
 end
...
end

For some reason, the stack trace wasn't displayed when I redirect to user_routes_path, so I have it direct to root_path and the same thing happens. Here is the trace for that:

app/views/layouts/_header.html.erb:3:in
  `_app_views_layouts__header_html_erb___917786942_46449696_315190'
app/views/layouts/application.html.erb:11:in
  `_app_views_layouts_application_html_erb__423035099_46500948_0'


I will give it a try, after reading Fernandez: The rails 3 way about redirect_to.

When you look at the output from rake routes, you have the output:

user_routes GET /users/:user_id/routes(.:format) {:action =>"index", :controller=>"routes"}

The methods you may use to that route are:

  • user_routes_url: Full URL (with protocol and everything)
  • user_routes_path: Relative URL to the host

But your user_routes tells you another thing: the URL has to contain a user_id, and this user_id has to come from somewhere. So to call the different url and path methods, you have to look at the arguments:

  • users_path: no argument, shows all users
  • user_path(@user): one argument, because the information about the user is needed. Could be the user, or the user_id
  • `user_routes_path(@user): needs the user, so that all routes (index view) for one user could be shown.

So include in you source code in the controller:

...
else
  sign_in user
  redirect_to user_routes_path(user)
end
...

I don't understand the error message you have appended, but I think you should first correct the path call.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜