Rails教程:before_filter已弃用。

3

Rails教程的10.2.1节使用了已经过时的before_filter。在UsersController中,现代惯用的写法是什么,以避免使用before_filter

这里是我尝试过的edit版本:

  def edit
    if ( signed_in? )
      @title = "Edit user"
    else
      deny_access
    end
  end

然而,当我运行rspec时,这会导致两个失败。
rspec ./spec/requests/friendly_forwardings_spec.rb:6 # FriendlyForwardings should forward to the requested page after signin
rspec ./spec/controllers/users_controller_spec.rb:266 # UsersController authentication of edit/update pages for non-signed-in users should deny access to 'edit'
4个回答

11

啊哈,你说得对。谢谢!我还是很好奇我上面发布的edit版本。有什么想法为什么它不等同于使用before_filter - dharmatech
很难在没有看到测试的情况下说出来。 - numbers1311407
仅为完整起见,我在下面发布了非 before_filter 版本。再次感谢您的帮助! - dharmatech

1
这是不依赖于before_filter并允许规范通过的edit版本:
  def edit
    if ( current_user )
      @user = User.find(params[:id])
      if ( current_user?(@user) )
        @title = "Edit user"
      else
        redirect_to(root_path)
      end
    else
      session[:return_to] = request.fullpath
      redirect_to("/signin" , :notice => "Please sign in to access this page.")
    end
  end

我在问题中发布的原始版本没有包含correct_user


1
这个答案只是为了指向现在正确的解决方案。
发布说明可以看出,before_filter已经在Rails 4.2中过时:

*_filter系列方法已经从文档中删除。使用*_action系列方法代替是不鼓励使用的:

有一个类似的问题:Rails 4:before_filter vs. before_action

1
现在它已经不过时了:“这些方法将来会被弃用,并最终从Rails中移除。” - webster
在5版本中已被弃用,将在5.1版本中移除。https://github.com/rails/rails/commit/7644a99 - tgf

1

Rails回调 - ActionController::Basebefore_action只是一个新的语法,用于替代before_filter

然而,在Rails 5.0中,所有的before_filters都已被弃用,并将在Rails 5.1中被删除。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接