首先是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 %>
答案 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
......或类似的东西。