我正在关注Michael Hartl教程Rails课程。在chapter 7上,我在UsersController上运行Reek,我得到以下警告:
app / controllers / users_controller.rb - 1警告: 1:InstanceVariableAssumption:UsersController对变量'@user'假设过多[https://github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md]
这是我的代码:
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new user_params
if @user.save
flash[:success] = t "welcome_to_app"
redirect_to @user
else
render "new"
end
end
def show
@user = User.find_by id: params[:id]
return if @user
flash[:danger] = t "not_exist_user"
redirect_to root_path
end
private
def user_params
params.require(:user).permit :name, :email, :password,
:password_confirmation
end
end
请解释为什么我收到此错误InstanceVariableAssumption以及如何解决此问题。
这看起来像是在GitHub页面上惹恼recommends disabling的气味之一。根据this bug report提交的项目,看起来这只是由于铁路使用/鼓励模式,默克不喜欢。
实例变量假设说:
类不应该假设实例变量在当前类定义之外设置或存在。
好吧,这就是在Rails中使用Convention over configuration的地方。 Rails有自己的做事方式,而且类:UsersController
依赖于类:User
。
变量:@user
是UsersController
中定义的实例变量,但这是类User
的对象。这就是Rails中完成的事情,你会发现它无处不在。
根据Reek gem,假设这不完美,但这就是Ruby on Rails中的事情。
我们可以像这样使用:
attr_reader :user, :users
然后所有@user,@ users都可以写成user
或users
。