实例变量假设:用户控制器假设实例变量'@user'太多



我正在学习Michael Hartl教程Rails课程。在第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

请解释为什么我收到此错误实例变量假设以及如何解决此问题。

这看起来像是 reek 建议在 GitHub 页面上禁用的气味之一。根据该项目提交的这个错误报告,这似乎只是由于 rails 使用/鼓励默认情况下不喜欢的模式。

实例变量假设 说:

不应假定实例变量是在当前类定义之外设置或存在的。

好吧,这就是 Rails 中约定优于配置的地方。Rails 有自己的做事方式,类:UsersController依赖于类:User

变量:@userUsersController中定义的实例变量,但这是类User的对象。这就是在 Rails 中完成工作的方式,你会在任何地方找到它。

假设根据 Reek gem 的说法,这并不完美,但这就是 Ruby on Rails 中完成工作的方式。

我们可以这样使用:

attr_reader :user, :users

然后所有@user,@users都可以写成userusers.

最新更新