使用STI路由失败

时间:2012-09-07 04:03:14

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 railstutorial.org sti

首先是SO帖子,但我读了这么多。自从研究Hartl的RailsTutorial以来,我是Rails的新手并建立了第一个网站。

我的问题是使用STI进行路由。我相信路线设置正确,但子类Kid没有找到“显示”路线。

使用STI的类继承

  

class User<的ActiveRecord ::基

     

class Kid<用户

儿童控制器

  

def show

     
    

@kid = Kid.find(params [:id])

  
     

用户控制器创建

def create
@user = User.new(params[:user])
if @user.save
  flash[:success] = "Welcome to kidtunes!"
  if (@user.type = "Kid")
    ***redirect_to @kid***
  else
redirect_to @parent
  end
else
  render 'new'
end

的routes.rb

  

资源:用户,:孩子,:父母

     

root to:'static_pages #home'

     

匹配'/ help',以:'static_pages#help'

     

匹配'/ contact',以:'static_pages #contact'

     

匹配'/ signup',以:'用户#new'

结果:

kids_new    GET    /kids/new(.:format)         kids#new
  users     GET    /users(.:format)            users#index
            POST   /users(.:format)            users#create
   new_user GET    /users/new(.:format)        users#new
  edit_user GET    /users/:id/edit(.:format)   users#edit
   user     GET    /users/:id(.:format)        users#show
            PUT    /users/:id(.:format)        users#update
            DELETE /users/:id(.:format)        users#destroy
   kids     GET    /kids(.:format)             kids#index
            POST   /kids(.:format)             kids#create
new_kid     GET    /kids/new(.:format)         kids#new
   edit_kid GET    /kids/:id/edit(.:format)    kids#edit
    kid     GET    /kids/:id(.:format)         kids#show
            PUT    /kids/:id(.:format)         kids#update
            DELETE /kids/:id(.:format)         kids#destroy
parents     GET    /parents(.:format)          parents#index
            POST   /parents(.:format)          parents#create
 new_parent GET    /parents/new(.:format)      parents#new
edit_parent GET    /parents/:id/edit(.:format) parents#edit
 parent     GET    /parents/:id(.:format)      parents#show
            PUT    /parents/:id(.:format)      parents#update
            DELETE /parents/:id(.:format)      parents#destroy
   root            /                           static_pages#home
   help            /help(.:format)             static_pages#help
contact            /contact(.:format)          static_pages#contact
 signup            /signup(.:format)           users#new

错误 我在redirect_to @kid

上获得以下内容

ActionController :: ActionControllerError(无法重定向到nil!):   app / controllers / users_controller.rb:16:在'create'

我觉得我已经检查了所有可以检查的东西,但我仍然遗漏了一些东西。 @kid应该正确地重定向到孩子#show route。我不确定我是否有一个制作精良的单表继承或基本的路由问题。

提前谢谢。 -John

表格

此表单在users / new.html.erb中使用,并创建用户。

<div class="row">
<div class="span5 offset2">
<%= form_for(@user) do |f| %>
<%= render 'shared/error_messages' %>

<%= f.label :fname, "First Name" %>
<%= f.text_field :fname %>

<%= f.label :lname, "Last Name" %>
<%= f.text_field :lname %>

<%= f.label :email %>
<%= f.text_field :email %>

<%= f.label :type, "Are you a Kid or Parent?" %>
<%= f.select :type, [['Kid','Kid'],['Parent','Parent']] %>

<%= f.label :password %>
<%= f.password_field :password %>

<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation %>

<%= f.submit "Create my account", class: "btn btn-large btn-primary" %>
<% end %>

2 个答案:

答案 0 :(得分:1)

我注意到的第一件事是您使用的是=而不是==

if (@user.type = "Kid")

我认为这样测试更好:

if @user.is_a? Kid

您能否告诉我们您如何设置@kid@parent

答案 1 :(得分:1)

您是否为@kid@parent变量定义/分配了值?如果没有,它们将为nil,您将收到问题中包含的cannot redirect to nil错误。

请提供create操作的完整代码。否则,我们就会完全信任(而不是自己阅读)重定向中正在发生的事情。

您的重定向可能还需要一些工作。例如,你可以这样做:

if (@user.is_a? Kid)
  redirect_to kid_path(@user)
else
  redirect_to parent_path(@user)
end

......或类似的东西。