2012-10-19 110 views
0

新手在學習Hartl's Rails Tutorial & video cast後,在他的第一個rails應用程序上工作。STI路由錯誤

我使用STI模型,其中:

class User < ActiveRecord::Base 
class Kid < User 
class Parent < User 

用戶擁有的基本要素:姓名,電子郵件等

我遇到的問題是路由。我繼續努力確定哪種模型最終在這種情況下效果最好(STI或多態)。我已經開始使用STI,如果能夠確定路由問題,我認爲我可以做到這一點。

我的問題是我的編輯正在尋找在用戶控制器中的「更新」行動時,我希望它的路線kidupdate我一直在閱讀很多關於SO STI路由職位,但我似乎無法圖爲什麼這不會正確路由。

Rspec測試。它配備的錯誤從 「click_button」

describe "with valid information" do 
    let(:new_first) { "New First" } 
    let(:new_last) { "New Last" } 
    let(:new_email) { "[email protected]" } 
    before do 
    fill_in "First Name",    with: new_first 
    fill_in "Last Name",    with: new_last 
    fill_in "Email",     with: new_email 
    select "Kid", from: "Are you a Kid or Parent" 
    fill_in "Password",     with: kid.password 
    fill_in "Confirmation",    with: kid.password 
    click_button "Save changes" 
    end 

Rspec的錯誤:

 KidPages edit with valid information 
    Failure/Error: click_button "Save changes" 
    AbstractController::ActionNotFound: 
     The action 'update' could not be found for UsersController 
    # (eval):2:in `click_button' 
    # ./spec/requests/kids_pages_spec.rb:32:in `block (4 levels) in <top (required)>' 

路線:

 root  /      static_pages#home 
     help  /help(.:format)   static_pages#help 
    contact  /contact(.:format)  static_pages#contact 
    signup  /signup(.:format)   users#new 
    signin  /signin(.:format)   sessions#new 
    signout DELETE /signout(.:format)  sessions#destroy 
    kidshow  /kids/:id(.:format)  users#kidshow 
    kidupate PUT /kids/:id(.:format)  users#kidupdate 
    kidedit  /kids/:id/edit(.:format) users#kidedit 
     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 
    sessions POST /sessions(.:format)  sessions#create 
new_session GET /sessions/new(.:format) sessions#new 
    session DELETE /sessions/:id(.:format) sessions#destroy 

的routes.rb

root to: 'static_pages#home' 
    match '/help', to: 'static_pages#help' 
    match '/contact', to: 'static_pages#contact' 
    match '/signup', to: 'users#new' 
    match '/signin', to: 'sessions#new' 
    match '/signout', to: 'sessions#destroy', via: :delete 
    match 'kids/:id', to: 'users#kidshow', :as => 'kidshow' 
    match 'kids/:id', to: 'users#kidupdate', :via => 'put', :as => 'kidupdate' 
    match 'kids/:id/edit', to: 'users#kidedit', :as => 'kidedit' 
    resources :users 
    resources :sessions, only: [:new, :create, :destroy] 

我一直在掙扎與這些概念和這個問題有關的幾個星期我欣賞幫助。

+0

另外,我的兩分錢關於STI和多態性。它們實際上用於各種不同的用例。當您有兩種不同類型的用戶時,您可能會在少數幾列中使用STI。您使用「類型」colomn在UserTypeA模型和UserTypeB模型中分配它們。 [Rails中的多態性(click)](http://railscasts.com/episodes/154-polymorphic-association)是完全不同的。對STI的改進是使用2個配置文件表來存儲其不同的用戶字段,並且主要將用戶表用於認證數據。 – benzhang

回答

1

您可以更好地組織您的控制器以完全避免此問題。見下面

的routes.rb

resources :kids 
resources :parents 

這將直接給你命名的路徑:

edit_kid_path(kid_id) 
edit_parent_path(parent_id) 

kids_controller.rb

class KidsController < ApplicationController 
    def update 
    end 
end 

parents_controller.rb

class ParentsController < ApplicationController 
    def update 
    end  
end 

如果你想分享控制器行爲,你可以做的潛在

class KidsController < UsersController 
end 

class ParentsController < UsersController 
end 

,把共同行動users_controller.rb和子控制器覆蓋它們。

關於使用何種模型關係的決定應與您如何構建控制器無關。控制器和路由是一個需要考慮的領域。建模數據完全是單獨考慮的。聲明資源只是一些匹配路線的捷徑。

如果你不打算使用用戶#更新等,聲明resources :users是不必要的,因爲你沒有使用任何聲明提供的路由。

+0

感謝您的詳細回覆。實際上,我開始使用單獨的控制器,我仍然將「kidupdate」動作路由到用戶#更新,當我認爲已將其路由到用戶#kidupdate時。在閱讀Alex Reisner關於STI繼承的熱門文章後,我決定簡化並嘗試在一個類中容納所有方法。但問題仍然存在。 – iamreff

+0

您確定實際上是通過對child /:id的放置請求來打開服務器嗎?你可以粘貼你的服務器日誌? tail -f logs/development.log應該給你這些信息。如果您在表單視圖中使用了user_path(@kid),那將使用用戶#更新。 – benzhang

+0

是的,它擊中<排除一些日誌> 呈現/Users/iamreff/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.3/lib/action_dispatch/middleware/templates/rescues/unknown_action。 erb內部救援/佈局(1.7ms) 開始PUT「/ users/1」for 127.0.0.1 at 2012-10-19 10:18:45 -0400 AbstractController :: ActionNotFound(動作'update'可以找不到UsersController): – iamreff