【问题标题】:Rails, Devise Invitations 406 Unacceptable error with STIRails,设计邀请 406 STI 出现不可接受的错误
【发布时间】:2012-07-28 14:28:13
【问题描述】:

有类似的问题,但我已经研究过,但没有一个申请过。

我正在使用DeviseDevise invitations。导轨 3.2.6。

棘手的是我有两个用户模型。用户和艺术家从用户继承的单表继承设置。我有两个邀请控制器允许分别向用户和艺术家发送邀请。

现在的问题是艺术家无法接受他们的邀请。在表单提交更新密码时,他们会收到 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 到末尾。我终其一生都看不到这种情况发生的原因或地点。如果我遗漏了任何可以提供帮助的信息,请告诉我。

【问题讨论】:

  • 我的猜测是 /artist/invitation.user 来自您在表单标签的 url 字段中输入的内容。查看生成的表单 html 并查看是否是这种情况。如果是,请尝试使用表单标签的选项,看看是否有帮助。
  • 谢谢。这导致我隔离变量。

标签: ruby-on-rails devise http-status-code-406


【解决方案1】:

终于明白了。

关键是要准确查看在整个表单和控制器操作中 resource_name 为您提供了什么。在我的情况下,当它需要成为 :artist 时,它继续回退到 :user ,正如 Frost 在评论中提到的那样,如果您注意使用 resource_name 的位置,生成的表单 html 会发生很大变化。需要重写控制器中的更新操作才能直接使用 :artist 并且需要调整 form_for 以从参数和 :as 参数中删除 resource_name。

【讨论】:

    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    相关资源
    最近更新 更多