Rails, Devise Invitations 406 Недопустимая ошибка с STI

Есть похожие вопросы, но я просмотрел их, и ни один из них не применился.

Я использую Devise и Разработать приглашения. Рельсы 3.2.6.

Сложность в том, что у меня есть две пользовательские модели. User и настройка наследования одной таблицы, где Artist наследуется от User. У меня есть два контроллера приглашений, чтобы разрешить отправку приглашений отдельно пользователям и исполнителям.

Проблема сейчас в том, что артисты не могут принять их приглашения. После отправки формы для обновления своего пароля они получают недопустимую ошибку 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

Описание формы. редактировать.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 в конец. Я не могу понять, почему и где это происходит. Пожалуйста, дайте мне знать, если я упустил какую-либо информацию, которая может помочь.


person ScotterC    schedule 28.07.2012    source источник
comment
Я предполагаю, что /artist/invitation.user исходит из того, что вы поместили в поле URL в теге формы. Посмотрите на сгенерированный HTML-код формы и убедитесь, что это так. Если это так, попробуйте немного поиграть с параметрами тега формы и посмотрите, поможет ли это.   -  person Frost    schedule 28.07.2012
comment
Спасибо. Это привело меня к изоляции переменной.   -  person ScotterC    schedule 29.07.2012


Ответы (1)


Понял, наконец.

Ключ в том, чтобы точно смотреть на то, что resource_name дает вам во всех действиях формы и контроллера. В моем случае он продолжал возвращаться к :user, когда он должен был быть :artist, и, как упомянул Фрост в комментарии, HTML-код сгенерированной формы сильно меняется, если вы обратите внимание на то, где используется имя_ресурса. Необходимо было переопределить действие update в контроллере, чтобы использовать :artist напрямую, а form_for необходимо было настроить, чтобы удалить resource_name из аргументов и аргумента :as.

person ScotterC    schedule 28.07.2012