0

HartlのRailsチュートリアルの本とビデオキャストを勉強した後、最初のRailsアプリケーションに取り組んでいる初心者。

私はSTIモデルを使用しています:

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

ユーザーには、名前、電子メールなどの基本的な要素があります。

私が抱えている問題はルーティングにあります。私は、どのモデルがこの状況(STIまたは多形性)で最終的に最もよく機能するかを決定することに引き続き取り組んでいます。私はSTIから始めましたが、ルーティングの問題を突き止めることができれば、これを機能させることができると思います。

私の問題は、編集がkidupdateにルーティングするときにユーザーコントローラーで「更新」アクションを探していることです。STIルーティングに関する多くのSO投稿を読んでいますが、なぜこれが行われないのか理解できないようです。正しくルーティングします。

Rspecテスト。エラーは「click_button」から発生します

describe "with valid information" do
  let(:new_first)   { "New First" }
  let(:new_last)    { "New Last" }
  let(:new_email)   { "new@example.com" }
  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

ルート.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]

私はこれらの概念とこの問題に何週間も苦労してきました、そして私は助けに感謝します。

4

1 に答える 1

1

この問題を完全に回避するために、コントローラーをより適切に編成できます。下記参照

ルート.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

親_コントローラー.rb

class ParentsController < ApplicationController
  def update
  end    
end

コントローラの動作を共有したい場合は、次のことができる可能性があります

class KidsController < UsersController
end

class ParentsController < UsersController
end

共通のアクションをusers_controller.rbに配置し、子コントローラーでそれらをオーバーライドします。

使用するモデルの関係に関する決定は、コントローラーの構造に依存しないようにする必要があります。コントローラとルーティングは考慮事項の1つです。データのモデリングは完全に個別に検討されます。また、リソースの宣言は、一致するルートのショートカットにすぎません。

users#updateなどを使用しない場合resources :usersは、宣言で提供されるルートを使用していないため、宣言は不要です。

于 2012-10-19T13:46:40.890 に答える