Rails, Devise Invitations 406 Неприемлемая ошибка с STI
Есть похожие вопросы, но я их обдумал, и ни один из них не подал заявку.
Я использую приглашения Devise и Devise. Рельсы 3.2.6.
Хитрость в том, что у меня есть две пользовательские модели. Пользователь и настройка наследования одной таблицы, где Artist наследует от пользователя. У меня есть два контроллера приглашений, которые позволяют отправлять приглашения отдельно как пользователям, так и исполнителям.
Проблема сейчас в том, что художники не могут принять их приглашения. После отправки формы обновления своего пароля они получают 406 недопустимую ошибку.
Соответствующий код:
Маршрутизация:
devise_for :users,
:class_name => User,
:controllers => { :invitations => 'user/invitations' }
namespace :artist do
# Special route for devise, artists invitation
devise_scope :user do
resource :invitation, :controller => :invitations, :only => [:create, :new, :update] do
get :accept, :action => :edit
end
end
end
Контроллер приглашений артиста
class Artist::InvitationsController < Devise::InvitationsController
respond_to :html
# PUT /resource/invitation
def update
self.resource = Artist.accept_invitation!(params[resource_name])
if resource.errors.empty?
resource.pending
flash[:notice] = "Welcome, complete your artist agreement to get started"
sign_in(:user, resource)
respond_with resource, :location => after_accept_path_for(resource)
else
respond_with_navigational(resource){ render :edit }
end
end
end
Описание формы. edit.html.erb.
<%= form_for resource, :as => resource_name, :url => artist_invitation_path(resource_name), :html => { :method => :put } do |f| %>
<%= f.hidden_field :invitation_token %>
<%= f.label :password, class: 'control-label' %>
<%= f.password_field :password, :placeholder => 'Enter a password' %>
<%= f.label :password_confirmation, class: 'control-label' %>
<%= f.password_field :password_confirmation, :placeholder => 'Confirm your password' %>
<%= f.submit "Set my password", :'data-disable-with' => "Hang on..." %>
<% end %>
Принять заголовки
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:236
Content-Type:application/x-www-form-urlencoded
Возвращает
Request URL:http://localhost:3000/artist/invitation.user
Request Method:POST
Status Code:406 Not Acceptable
Я вижу, что что-то в формате должно быть отключено из-за добавления ответа в этом.user до конца. Я не могу за всю жизнь понять, почему или где это происходит. Пожалуйста, дайте мне знать, если есть какая-то информация, которую я оставил, которая могла бы помочь.
1 ответ
Понял, наконец.
Ключ должен точно смотреть на то, что resource_name дает вам в форме и действиях контроллера. В моем случае он продолжал возвращаться к: user, когда это было необходимо:artist, и, как упомянул Frost в комментарии, сгенерированный html формы сильно меняется, если вы обращаете внимание на то, где используется имя_ресурса. Действие обновления в контроллере нужно было переопределить, чтобы использовать:artist напрямую, а форму_for нужно настроить, чтобы удалить resource_name из аргументов и аргумент:as.