使用Rails和Devise的before_action顺序

时间:2018-01-19 20:17:06

标签: ruby-on-rails ruby devise

在我的应用中,用户可以通过iframe在其他网站中嵌入表单。为此,他们可以在表格中指定“表单设置”,例如e。 G。表格的背景颜色。在此表中,他们还可以指定填写表单的用户是否必须登录。

存在两种类型的身份验证方法:

  1. 用户必须通过Devise(auth_id == 1)
  2. 登录
  3. 用户无需登录(auth_id == 2)
  4. 因此我的控制器看起来像是:

    class MyController < ApplicationController  
      before_action :load_form_settings
      before_action :authenticate_user!, if: @settings.auth_id == 1
      ...
    
      private
      def load_form_settings
        @settings = Formsetting.find_by(:form_id => params[:form_id])
      end
    
    end
    

    然而,它说@settings是零。似乎在:load_form_settings之前运行:authenticate_user!没有效果。我做错了什么?

1 个答案:

答案 0 :(得分:1)

尝试if: -> { @settings.auth_id == 1 }

before_action是一种类方法。它为MyController的实例方法的回调数组添加了一个新的回调。当您从控制器调用实例方法时,将执行这些回调。

@settings.auth_id == 1是一个表达式。它在向数组添加回调时执行。如果希望在回调执行时执行符号或proc,则需要传递符号或proc。