什么样的逻辑应该在Rails之前过滤器

问题描述:

我应该在过滤器之前加载并检查数据库源的存在吗?什么样的逻辑应该在Rails之前过滤器

在我们的应用程序中,我们总是加载并检查具有由params传入的id的DB源的存在。我不确定这是否是一个好的模式。

喜欢:

before_action :set_org 

private 

def seg_org 
    @org ||= Organization.find params[:id] 
    resource_not_found unless @org 
end 
+0

不['find'(http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods。 html#method-i-find)已经引发错误?在这种情况下,你的'resource_not_found'根本不会被执行。所以最好删除它。 – vee

+1

这实际上是如何[rails scaffold generator](https://github.com/rails/rails/blob/master/railties/lib/rails/generators/rails/scaffold_controller/templates/controller.rb)设置控制器默认情况下(第7和55行)。所以这是一个相当不错的标志,如果没有别的东西,这不是一个可怕的想法或做事的方式 –

+0

@vee'find'不会产生任何错误。如果没有发现,它将返回'nil'。 – hiveer

是,找到一个记录并将其设置为一个实例变量是用于控制器的过滤器的常用约定。一般来说,任何可以运行多个操作的代码都是很好的选择。说你要重定向到登录页面,如果当前用户没有登录。

class UsersController < ApplicationController 
    before_action :require_login 
    before_action :set_user, only: [:show, :edit, :update, :destroy] 

    private 

    def require_login 
    unless logged_in? 
     flash[:error] = "You must be logged in to access this section" 
     redirect_to new_login_url # halts request cycle 
    end 
    end 

    def set_user 
    @user = User.find(params[:id]) 
    end 
end 
+0

为什么这是downvoted? –

+0

我不知道是谁做的。 :) 任何方式,我投你回来。 – hiveer

+0

@hiveer lol thanks:)当某些事情被拒绝投票时,我们很高兴得到一个评论,所以可以改进。我觉得这是一个合理的答案,所以我只是困惑。这个答案有帮助吗? –