在Rails

时间:2015-06-16 15:48:28

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我正在尝试编写一个简单的帮助方法,检查用户的电子邮件地址是否包含特定的域名。我的所有控制器都需要这个方法,并且取决于current_user的状态,所以我觉得最好把它放在我的ApplicationController中。根据第3行方法的评估,调用第二个辅助方法。我在this question's answer上对我的设置进行了建模。

当我插入此代码并刷新页面时,应该点击binding.pry,表示正在评估我定义的辅助方法,但这不会发生。相反,:disable_intercom?评估为true而不按下面的方法。如果我删除冒号,我会收到一条错误消息,指出disable_intercom?未定义。我在这里缺少什么?

class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception
    skip_after_action :intercom_rails_auto_include if :disable_intercom?

    private

    def disable_intercom?
        binding.pry
        if user_signed_in?
            current_user.email.split('@').include?('mysite.com') ? true : false
        else
            false
        end
    end
end

谢谢!

更新:

以下是我发现的关于此问题的一些其他StackOverflow讨论。我已经尝试了各种解决方案,但似乎没有触发disable_intercom?方法。

conditionally apply skip_before_filter with :if => condition in rails 4

skip_before_filter ignores conditionals

2 个答案:

答案 0 :(得分:1)

替换:

 skip_after_action :intercom_rails_auto_include if :disable_intercom?

使用:

 skip_after_action :intercom_rails_auto_include, if: :disable_intercom?

在您的初始代码中,这是有效的ruby,您基本上总是跳过,因为您没有将if作为选项传递给skip_after_action,当符号真实时,即触发行,即始终

答案 1 :(得分:0)

问题似乎是skip_after_action不接受条件参数,例如if:unless:。即使您传递条件,也始终执行skip_after_action回调。

对我来说不幸的是,这意味着不可能做我想用代码做的事情。我正在研究有条件地禁用内部通信API的其他方法,因为使用条件skip_after回调不是一个可行的解决方案。