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