Section 10.2.1使用了不推荐使用的before_filter
。在UsersController
中编写代码以便不使用before_filter
的现代惯用方式是什么?
这是我尝试的edit
版本:
def edit
if ( signed_in? )
@title = "Edit user"
else
deny_access
end
end
但是,这会在我运行rspec时触发2次失败。
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'
答案 0 :(得分:11)
before_filter
。您可能会感到困惑,因为定义在Rails 3中从AbstractController::Callbacks
移到了ActionController::Filters::ClassMethods
,但它仍然非常活跃和踢。
这里是Rails 3.1中定义的,不含引用的:
https://github.com/rails/rails/blob/v3.1.0.rc6/actionpack/lib/abstract_controller/callbacks.rb#L80
答案 1 :(得分:1)
这里的edit
版本并不依赖于before_filter
并且允许规范通过:
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
。
答案 2 :(得分:1)
这个答案只是为了指出正确的解决方案。
在release notes:的Rails 4.2中不推荐使用 before_filter
* _filter系列方法已被删除 文档。不鼓励使用它们以支持* _action 方法家族:
有一个类似的问题:Rails 4: before_filter vs. before_action。
答案 3 :(得分:1)
Rails CallBacks - ActionController::Base
,before_action
只是before_filter的新语法。
但是,Rails 5.0中的所有before_filters
are deprecated都将在Rails 5.1中删除
这只是一个名称变更。 before_action
更具体,因为它在行动之前执行。