设计authenticate_user!在进行远程操作时中断:对非设计控制器操作的真实请求

时间:2016-12-08 23:53:48

标签: ruby-on-rails ajax authentication devise

我遇到了Devise' before_action :authenticate_user!选项remote: true过滤。

我有一个链接标记,可以向我messages#read以下的MessagesController发送正常的PUT请求

<%= link_to 'Mark Read/Unread', read_message_path(message), method: :put %>

class MessagesController < ApplicationController
  before_action :authenticate_user!, only: :read
  before_action :set_message, only: :read
  ...
  #http PUT
  def read
    @message.toggle!(:read)
    respond_to do |format|
      format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' }
      format.json { head :no_content }
    end
  end 
  ...
end 

如果用户未登录,则会将其重定向到登录页面,作为预期的设计行为。

但是,在链接上设置 remote: true 选项时,例如

<%= link_to 'Mark Read/Unread', read_message_path(message), method: :put, remote: true %>

设计中断错误:PUT http://localhost:3000/users/sign_in.js 404 (Not Found)

我的日志输出401 Unauthorized后跟

ActionController::RoutingError (No route matches [PUT] "/users/sign_in.js")

enter image description here

问题是Rails尝试通过PUT渲染/users/sign_in.js,而PUT不存在且不应该。这就是让我感到困惑并让我感到困惑的原因,因为我会考虑重定向到设计/users/sign_in html页面,而Rails尝试渲染一个带有.js扩展名的sign_in页面。

我尝试将config/initializers/devise.rb行设置为

config.http_authenticatable_on_xhr = false

建议here

config.navigational_formats = ['*/*', :html, :js]

我正在使用Devise的默认设置。没有特殊路线也没有控制器。

我在这里缺少什么?我是否误解了Devise的工作方式?

是否可以覆盖authenticate_user!重定向以设计&#39;关于xhr请求的默认sign_in html页面?

2 个答案:

答案 0 :(得分:0)

在进行jquery ajax调用时遇到了类似的问题。 奇怪的是它正在使用button_to远程调用。

我的解决方案是将方法更改为POST,将预期的响应类型更改为script

  $.ajax({
          url: myurl,
          type: 'POST',
          data: {myvar: myval},
          dataType: 'script',

答案 1 :(得分:-1)

如果用户未登录,请勿显示该链接。