3

我正在关注 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-假设.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 以及如何解决这个问题。

4

3 回答 3

6

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

于 2017-07-12T07:58:41.947 回答
1

实例变量假设 说:

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

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

变量:@user是在 中定义的实例变量UsersController,但这是类的对象User。这就是在 Rails 中的工作方式,你会发现它无处不在。

假设根据Reek gem 这并不完美,但这就是在 Ruby on Rails 中完成的事情。

于 2017-07-12T07:59:00.233 回答
0

我们可以这样使用:

attr_reader :user, :users

然后所有的@user、@users 都可以写成useror users

于 2018-03-05T11:38:19.603 回答