Ошибка маршрутизации STI

Новичок работает над своим первым приложением rails после изучения учебника и видео ролика Hartl's Rails.

Я использую модель ИППП, где:

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

Пользователь имеет основные элементы: имя, адрес электронной почты и т. Д.

У меня проблема с маршрутизацией. Я продолжаю работать над определением того, какая модель в конечном итоге будет лучше всего работать в этой ситуации (ИППП или полиморфная). Я начал с STI и думаю, что смогу заставить это работать, если смогу решить проблемы с маршрутизацией.

Моя проблема заключается в том, что моя правка ищет действие "обновить" в контроллере пользователей, когда я хочу, чтобы он обновлялся до обновления. Я читал много SO-сообщений о маршрутизации STI, но я не могу понять, почему это не будет маршрут правильно.

Тест 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

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]

Я боролся с этими концепциями и этой проблемой в течение нескольких недель, и я ценю помощь.

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 не требуется, так как вы не используете ни один из маршрутов, предоставляемых объявлением.

Другие вопросы по тегам