【问题标题】:Rails 4: before_filter vs. before_actionRails 4:before_filter 与 before_action
【发布时间】:2013-05-07 08:32:11
【问题描述】:

在 Rails >4.0.0 中,生成器使用 before_action 而不是 before_filter 创建 CRUD 操作。它似乎做同样的事情。那么这两者有什么区别呢?

【问题讨论】:

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


    【解决方案1】:

    仅在 rspec-rails 中使用 before_action,因为 before_filter 水豚会在测试过程中行为不端给惊喜

    class TodosController < ApplicationController
      before_filter :authenticate
    
      def index
        @todos = Todo.all
      end
      ## Rest of the code follows
    end
    

    过滤前

    feature 'User creates todo' do
      scenario 'successfully' do
        sign_in
        click_on 'Add Todo'
        fill_in 'Title', with: "Buy Milk"
        click_on 'Submit'
    
        expect(page).to have_css '.todos li', text: "Buy Milk"
      end
    end
    

    预期的失败是

    NoMethodError:
           undefined method `authenticate' for #<TodosController:0x0000558b68573f48>
    

    但是 before_filter 给出了...

    ActionView::Template::Error:
           undefined method `each' for nil:NilClass
    

    也就是说,钩子以某种方式运行而没有错误,但是控制器以未初始化的@todos 进行查看 更好地节省时间,使用非弃用代码...

    【讨论】:

      【解决方案2】:

      正如我们在ActionController::Base 中的see 一样,before_action 只是new syntaxbefore_filter

      但是,Rails 5.0 中的 before_filter 语法 is deprecated 将在 Rails 5.1

      中删除

      【讨论】:

      • 一方面弃用是有道理的,但另一方面在 Rails 和 ruby​​ 中有一个很好的做法,可以为一种方法设置多个别名,这样您就可以在不同的上下文中使用它而不会失去意义。
      • 在 4.2 中,他们并没有弃用它,而是将其从文档中删除,因为不鼓励这样做。 edgeguides.rubyonrails.org/…
      • 如果不鼓励,那么为什么不会弃用它?傻。
      • @JohnWhitley - 弃用不会破坏 API。这就是弃用的全部意义所在。
      • @JohnWhitley - 垃圾邮件是有原因的。任何纪律严明的项目都应通过不使用已弃用的函数来解决弃用警告。
      【解决方案3】:

      before_filter/before_action:表示在任何动作执行之前要执行的任何事情。

      两者都是一样的。它们只是彼此的别名,因为它们的行为是相同的。

      【讨论】:

        【解决方案4】:

        要弄清楚before_action和before_filter有什么区别,我们应该了解action和filter的区别。

        动作是您可以路由到的控制器的方法。 例如,您的用户创建页面可能会路由到 UsersController#new - new 是此路由中的操作。

        过滤器根据控制器操作运行 - 在它们之前、之后或周围。 这些方法可以通过将公共数据重定向或设置到控制器中的每个操作来停止操作处理。

        Rails 4 –> _action

        Rails 3 –> _filter

        【讨论】:

          【解决方案5】:

          这只是一个名称更改。 before_action 更具体,因为它在操作之前执行。

          【讨论】:

            【解决方案6】:

            只是语法不同,在rails应用程序中有CRUD,七个动作基本上按名称indexnewcreate、显示、更新编辑销毁

            Rails 4 让开发人员友好地将语法 before filter 更改为 before action

            before_action在我们声明的动作之前调用方法,比如

            before_action :set_event, only: [:show, :update, :destroy, :edit]
            

            set_event 是一个总是在显示、更新、编辑和销毁之前调用的方法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-06-15
              • 2013-07-28
              • 1970-01-01
              • 1970-01-01
              • 2017-05-25
              • 1970-01-01
              • 1970-01-01
              • 2016-02-04
              相关资源
              最近更新 更多