Rails 4 设计:SessionsController:UnknownFormat:406 错误

Rails 4 Devise: SessionsController: UnknownFormat: 406 error

我正在尝试使用 Devise 登录,但登录失败并收到来自 Rails 4 的 406 Not Acceptable 消息。具体来说:

Started POST "/login.user" for 127.0.0.1 at 2015-04-03 14:37:21 -0600
Processing by Devise::SessionsController#create as
  Parameters: {"utf8"=>"✓",
               "authenticity_token"=>"RLOQtv2L80h1VnMKynBuGsqsTEoggZzk3dWk6h8WdfQLOaOcoznTsPDortDQD5ql8qHm52l3+qnAxTf6U+dLxQ==",
               "user"=>{"email"=>"jack@example.com",
                        "password"=>"[FILTERED]",
                        "remember_me"=>"0"},
               "commit"=>"Log in"}
  User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."email" =   ORDER BY "users"."id" ASC LIMIT 1  [["email", "jack@example.com"]]
   (0.2ms)  BEGIN
  Role Load (0.4ms)  SELECT "roles".* FROM "roles" INNER JOIN "unities" ON "roles"."id" = "unities"."role_id" WHERE "unities"."user_id" =  AND (((roles.name = 'nil') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 4]]
  SQL (0.5ms)  UPDATE "users" SET "last_sign_in_at" = , "current_sign_in_at" = , "sign_in_count" = , "updated_at" =  WHERE "users"."id" =   [["last_sign_in_at", "2015-04-03 20:27:03.080761"], ["current_sign_in_at", "2015-04-03 20:37:21.763619"], ["sign_in_count", 7], ["updated_at", "2015-04-03 20:37:21.797872"], ["id", 4]]
   (1.7ms)  COMMIT
Completed 406 Not Acceptable in 160ms (ActiveRecord: 6.0ms)

我正在尝试调整我找到的会话控制器 here;这些是相关部分:

class Users::SessionsController < DeviseController
  prepend_before_filter :require_no_authentication, only: [:new, :create]
  prepend_before_filter :allow_params_authentication!, only: :create
  prepend_before_filter :verify_signed_out_user, only: :destroy
  prepend_before_filter only: [:create, :destroy] { request.env["devise.skip_timeout"] = true }

  # GET /resource/sign_in
  def new
    self.resource = resource_class.new(sign_in_params)
    clean_up_passwords(resource)
    yield resource if block_given?
    respond_with(resource, serialize_options(resource))
  end

  # POST /resource/sign_in
  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_flashing_format?
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, location: after_sign_in_path_for(resource)
  end
end

相关路线如下:

                  Prefix Verb     URI Pattern                  Controller#Action
        new_user_session GET      /login(.:format)             devise/sessions#new
            user_session POST     /login(.:format)             devise/sessions#create
    destroy_user_session GET      /sign_out(.:format)          users/sessions#destroy

我的 sessions/new.html.erb 视图使用这种形式:

<%= form_for(resource, as: resource_name, url: user_session_path(resource_name)) do |f| %>
    <input name="authenticity_token"
           type="hidden"
           value="<%= form_authenticity_token %>"/>
    <div class="field">
      <%= f.label :email %><br />
      <%= f.email_field :email, autofocus: true %>
    </div>
    <div class="field">
      <%= f.label :password %><br />
      <%= f.password_field :password, autocomplete: "off" %>
    </div>
    <% if devise_mapping.rememberable? -%>
        <div class="field">
          <%= f.check_box :remember_me %>
          <%= f.label :remember_me %>
        </div>
    <% end -%>
    <div class="actions">
      <%= f.submit "Log in" %>
    </div>
<% end %>

注意我添加了隐藏的 authenticity_token 试图解决 406 Not Acceptable 消息(我的 application.html.erb 视图中也有 <%= csrf_meta_tags %>),并且从 POST 我可以看到它正在发送。

我的用户模型有 devise: :database_authenticatablevalidates_presence_of :email, :password

感谢任何提示或建议!我尝试了很多建议,也有类似的问题 here。我可以提供任何其他可能有帮助的信息。

我使用 'omniauth-google-oauth2'gem.

解决了这个问题